📄 ioctl.c
字号:
//-----------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//-----------------------------------------------------------------------------
//
// Copyright (C) 2004-2006, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//-----------------------------------------------------------------------------
//
// File: ioctl.c
//
// This file implements the OEM's IO Control (IOCTL) functions and declares
// global variables used by the IOCTL component.
//
//-----------------------------------------------------------------------------
#include <bsp.h>
#if defined(BSP_SMARTPHONE) || defined(BSP_POCKETPC)
#include <poweron.h> // Needed for IOCTL_HAL_GET_POWERONREASON handler.
#endif // defined(BSP_SMARTPHONE) || defined(BSP_POCKETPC)
extern HANDLE SC_CreateMutex(LPSECURITY_ATTRIBUTES lpsa, BOOL bInitialOwner, LPCTSTR lpName);
//-----------------------------------------------------------------------------
// Global Variables
BOOL g_oalPostInit = FALSE;
HANDLE g_oalPmicMutex;
//------------------------------------------------------------------------------
//
// Global: g_oalIoctlPlatformType/OEM
//
// Platform Type/OEM
//
LPCWSTR g_oalIoCtlPlatformType = IOCTL_PLATFORM_TYPE;
LPCWSTR g_oalIoCtlPlatformOEM = IOCTL_PLATFORM_OEM;
//------------------------------------------------------------------------------
//
// Global: g_oalIoctlProcessorVendor/Name/Core
//
// Processor information
//
LPCWSTR g_oalIoCtlProcessorVendor = IOCTL_PROCESSOR_VENDOR;
LPCWSTR g_oalIoCtlProcessorName = IOCTL_PROCESSOR_NAME;
LPCWSTR g_oalIoCtlProcessorCore = IOCTL_PROCESSOR_CORE;
//------------------------------------------------------------------------------
//
// Global: g_oalIoctlInstructionSet
//
// Processor instruction set identifier
//
UINT32 g_oalIoCtlInstructionSet = IOCTL_PROCESSOR_INSTRUCTION_SET;
UINT32 g_oalIoCtlClockSpeed = IOCTL_PROCESSOR_CLOCK_SPEED;
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalPostInit
//
// This function is the next OAL routine called by the kernel after OEMInit and
// provides a context for initializing other aspects of the device prior to
// general boot.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalPostInit(
UINT32 code, VOID *pInpBuffer, UINT32 inpSize, VOID *pOutBuffer,
UINT32 outSize, UINT32 *pOutSize)
{
// Set flag to indicate it is okay to call Sleep within OAL
g_oalPostInit = TRUE;
// Initialize platform OAL critical sections
g_oalPmicMutex = SC_CreateMutex(NULL, FALSE, L"MUTEX_PMIC");
return(TRUE);
}
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalPresuspend
//
// This function implements IOCTL_HAL_PRESUSPEND which provides the OAL
// the time needed to prepare for a suspend operation. Any preparation is
// completed while the system is still in threaded mode.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalPresuspend(
UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer,
UINT32 outSize, UINT32 *pOutSize)
{
// Do nothing for now.
//
return(TRUE);
}
//------------------------------------------------------------------------------
//
// Function: OALIoCtlQueryDispSettings
//
// This function implements IOCTL_HAL_QUERY_DISPLAYSETTINGS and is used by
// graphics device interface (GDI) to query the kernel for information about
// a preferred resolution for the system to use.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlQueryDispSettings (
UINT32 code, VOID *lpInBuf, UINT32 nInBufSize, VOID *lpOutBuf,
UINT32 nOutBufSize, UINT32 *lpBytesReturned)
{
DWORD dwErr = 0;
if (lpBytesReturned) {
*lpBytesReturned = 0;
}
if (!lpOutBuf) {
dwErr = ERROR_INVALID_PARAMETER;
}
else if (sizeof(DWORD)*3 > nOutBufSize) {
dwErr = ERROR_INSUFFICIENT_BUFFER;
} else {
__try {
((PDWORD)lpOutBuf)[0] = (DWORD) BSP_PREF_DISPLAY_WIDTH;
((PDWORD)lpOutBuf)[1] = (DWORD) BSP_PREF_DISPLAY_HEIGHT;
((PDWORD)lpOutBuf)[2] = (DWORD) BSP_PREF_DISPLAY_BPP;
if (lpBytesReturned) {
*lpBytesReturned = sizeof (DWORD) * 3;
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
dwErr = ERROR_INVALID_PARAMETER;
}
}
if (dwErr) {
NKSetLastError (dwErr);
}
return !dwErr;
}
#if defined(BSP_SMARTPHONE) || defined(BSP_POCKETPC)
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalProfile
//
// This function implements IOCTL_HAL_GET_PROFILE.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalProfile(
UINT32 code, VOID *lpInBuf, UINT32 nInBufSize, VOID *lpOutBuf,
UINT32 nOutBufSize, UINT32 *lpBytesReturned)
{
DWORD dwErr = 0;
if (lpBytesReturned) {
*lpBytesReturned = 0;
}
if (!lpOutBuf) {
dwErr = ERROR_INVALID_PARAMETER;
}
if (dwErr) {
NKSetLastError (dwErr);
}
// We always return FALSE here because we do not support profiling in
// normal builds.
return FALSE;
}
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalGetHiveCleanFlag
//
// This function implements IOCTL_HAL_GET_HIVE_CLEAN_FLAG and is used to
// determine if the registry hive needs to be erased when booting.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalGetHiveCleanFlag(
UINT32 code, VOID *lpInBuf, UINT32 nInBufSize, VOID *lpOutBuf,
UINT32 nOutBufSize, UINT32 *lpBytesReturned)
{
DWORD dwErr = 0;
if (lpBytesReturned) {
*lpBytesReturned = 0;
}
if (!lpOutBuf) {
dwErr = ERROR_INVALID_PARAMETER;
}
else if (sizeof(DWORD) > nOutBufSize) {
dwErr = ERROR_INSUFFICIENT_BUFFER;
}
if (dwErr) {
NKSetLastError (dwErr);
}
// We always return FALSE here because we do not need to have the
// registry hive erased when booting.
return FALSE;
}
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalGetPowerOnReason
//
// This function implements IOCTL_HAL_GET_POWERONREASON and is used for
// determining why the device powered on.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalGetPowerOnReason(
UINT32 code, VOID *lpInBuf, UINT32 nInBufSize, VOID *lpOutBuf,
UINT32 nOutBufSize, UINT32 *lpBytesReturned)
{
DWORD dwErr = 0;
if (lpBytesReturned) {
*lpBytesReturned = 0;
}
if (!lpOutBuf) {
dwErr = ERROR_INVALID_PARAMETER;
}
else if (sizeof(POWERONREASON) > nOutBufSize) {
dwErr = ERROR_INSUFFICIENT_BUFFER;
} else {
__try {
POWERONREASON *pReasonStruct = (POWERONREASON *)lpOutBuf;
// For now, we always give the reason as a reboot. Later on, when
// we have persistent storage properly implemented, then we can
// also support the other possible power on reasons (if required):
//
// - due to a reminder (POWERON_REMINDER)
// - due to a scheduled time event (POWERON_SCHEDULEDTIME)
// - due to a system interrupt
//
pReasonStruct->dwFlags = PO_REASON;
pReasonStruct->dwReason = POWERON_CPM_REBOOT;
if (lpBytesReturned) {
*lpBytesReturned = sizeof (POWERONREASON);
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
dwErr = ERROR_INVALID_PARAMETER;
}
}
if (dwErr) {
NKSetLastError (dwErr);
}
return FALSE;
}
//------------------------------------------------------------------------------
//
// Function: OALIoCtlHalGetRndisMacAddr
//
// This function implements IOCTL_HAL_GET_RNDIS_MACADDR and is used by the
// OEM to determine the RNDIS MAC address.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalGetRndisMacAddr(
UINT32 code, VOID *lpInBuf, UINT32 nInBufSize, VOID *lpOutBuf,
UINT32 nOutBufSize, UINT32 *lpBytesReturned)
{
DWORD dwErr = 0;
if (lpBytesReturned) {
*lpBytesReturned = 0;
}
if (!lpOutBuf) {
dwErr = ERROR_INVALID_PARAMETER;
}
else if (sizeof(BYTE) * 6 > nOutBufSize) {
dwErr = ERROR_INSUFFICIENT_BUFFER;
}
if (dwErr) {
NKSetLastError (dwErr);
}
// We always return FALSE here because we do not need to override the
// default RNDIS MAC address.
return FALSE;
}
#endif // defined(BSP_SMARTPHONE) || defined(BSP_POCKETPC)
//------------------------------------------------------------------------------
//
// Global: g_oalIoCtlTable[]
//
// IOCTL handler table. This table includes the IOCTL code/handler pairs
// defined in the IOCTL configuration file. This global array is exported
// via oal_ioctl.h and is used by the OAL IOCTL component.
//
const OAL_IOCTL_HANDLER g_oalIoCtlTable[] = {
#include "ioctl_tab.h"
};
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -