📄 devapi.c
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// This source code is licensed under Microsoft Shared Source License
// Version 1.0 for Windows CE.
// For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223.
//
#include <windows.h>
#include <devload.h>
#include <console.h>
#include "devmgrp.h"
#include "celogdev.h"
#include "devmgrif.h"
#include "pmif.h"
#include "devzones.h"
// This routine exposes AdvertiseInterface() to device drivers that link directly
// with the device manager DLL. The hDevice parameter is the device handle provided
// to the driver in its Init() entry point. The other parameters are exactly equivalent
// to those of AdvertiseInterface(). This routine returns ERROR_SUCCESS if
// the interface is successfully advertised, or a Win32 error code if it is not.
DWORD WINAPI
DmAdvertiseInterface(HANDLE hDevice, const GUID *devclass, LPCWSTR name, BOOL fAdd)
{
return I_AdvertiseDeviceInterface((fsdev_t *) hDevice, devclass, name, fAdd);
}
// This routine handles RegisterDevice() calls and routes them internally
// to I_RegisterDeviceEx().
HANDLE
DM_RegisterDevice(
LPCWSTR lpszType,
DWORD dwIndex,
LPCWSTR lpszLib,
DWORD dwInfo
)
{
return I_RegisterDeviceEx(
lpszType,
dwIndex,
lpszLib,
dwInfo
);
}
// @func BOOL | DeregisterDevice | Deregister a registered device
// @parm HANDLE | hDevice | handle to registered device, from RegisterDevice
// @rdesc Returns TRUE for success, FALSE for failure
// @comm DeregisterDevice can be used if a device is removed from the system or
// is being shut down. An example would be:<nl>
// <tab>DeregisterDevice(h1);<nl>
// where h1 was returned from a call to RegisterDevice.
// @xref <f RegisterDevice> <l Overview.WinCE Device Drivers>
BOOL DM_DeregisterDevice(HANDLE hDevice)
{
BOOL retval = I_DeregisterDevice(hDevice);
return retval;
}
//
// @func HANDLE | ActivateDevice | Register a device and add it to the active list under HKEY_LOCAL_MACHINE\Drivers\Active.
// @parm LPCWSTR | lpszDevKey | The driver's device key under HKEY_LOCAL_MACHINE\Drivers (for example "Drivers\PCMCIA\Modem")
// @parm DWORD | dwClientInfo | Instance information to be stored in the device's active key.
// @rdesc Returns a handle to a device, or 0 for failure. This handle should
// only be passed to DeactivateDevice
// @comm ActivateDevice will RegisterDevice the specified device and
// create an active key in HKEY_LOCAL_MACHINE\Drivers\Active for the new device.
// Also the device's creation is announced to the system via a
// WM_DEVICECHANGE message and through the application notification system.
//
// An example would be:<nl>
// <tab>hnd = ActivateDevice(lpszDevKey, dwClientInfo);<nl>
// where hnd is a HANDLE that can be used for DeactivateDevice<nl>
// lpszDevKey is the registry path in HKEY_LOCAL_MACHINE to the device
// driver's device key which has values that specify the driver name and
// device prefix.<nl>
// dwClientInfo is a DWORD value that will be stored in the device's active
// key.<nl>
// @xref <f DeactivateDevice> <f RegisterDevice> <f DeregisterDevice> <l Overview.WinCE Device Drivers>
//
HANDLE DM_ActivateDeviceEx(
LPCTSTR lpszDevKey,
LPCREGINI lpReg,
DWORD cReg,
LPVOID lpvParam
)
{
DEBUGMSG(ZONE_ACTIVE, (TEXT("DEVICE!ActivateDeviceEx(%s) entered\r\n"), lpszDevKey));
CELOG_ActivateDevice (lpszDevKey);
// lpReg will be validated inside StartOneDriver
return I_ActivateDeviceEx(
lpszDevKey,
lpReg, cReg, lpvParam);
}
//
// @func BOOL | DeactivateDevice | Deregister a registered device and remove
// it from the active list.
// @parm HANDLE | hDevice | handle to registered device, from ActivateDevice
// @rdesc Returns TRUE for success, FALSE for failure
// @comm DeactivateDevice will DeregisterDevice the specified device and
// delete the device's active key from HKEY_LOCAL_MACHINE\Drivers\Active.
// Also the device's removal is announced to the system via a
// WM_DEVICECHANGE message and through the application notification system.
// An example would be:<nl>
// <tab>DeactivateDevice(h1);<nl>
// where h1 was returned from a call to ActivateDevice.
// @xref <f ActivateDevice> <f RegisterDevice> <f DeregisterDevice> <l Overview.WinCE Device Drivers>
//
BOOL DM_DeactivateDevice(HANDLE hDevice)
{
return I_DeactivateDevice(hDevice);
}
BOOL DM_GetDeviceInformationByDeviceHandle(HANDLE hDevice, PDEVMGR_DEVICE_INFORMATION pdi)
{
DWORD dwStatus = ERROR_INVALID_PARAMETER;
// shall we call our internal routine to get the information?
if(pdi != NULL) {
dwStatus = I_GetDeviceInformation((fsdev_t *) hDevice, pdi);
}
if(dwStatus != ERROR_SUCCESS) {
SetLastError(dwStatus);
return FALSE;
} else {
return TRUE;
}
}
// This routine handles power callbacks for all registered devices.
// On suspend, callbacks are invoked in reverse order of driver loading
// so that the last driver loaded (which may depend on an earlier
// driver) gets called first. On resume, callbacks are loaded in the
// same order as driver load. The Power Manager is notified last on
// suspend and first on resume.
void DevMgrPowerOffHandler(BOOL bOff)
{
fsdev_t *lpdev;
if (bOff) {
// Notify drivers of power off in reverse order from that in which
// they were loaded.
for (lpdev = (fsdev_t *)g_DevChain.Blink;
lpdev != (fsdev_t *)&g_DevChain;
lpdev = (fsdev_t *)lpdev->list.Blink) {
if (lpdev->fnPowerdn) {
DEBUGMSG(ZONE_PNP,(TEXT("Calling \'%s\' PowerDown at 0x%x\r\n"),
lpdev->pszDeviceName != NULL ? lpdev->pszDeviceName : L"<Unnamed>", lpdev->fnPowerdn));
__try {
lpdev->fnPowerdn(lpdev->dwData);
}
__except(EXCEPTION_EXECUTE_HANDLER) {
DEBUGMSG(ZONE_ERROR,(TEXT("DEVICE! Exception calling PowerDown for '%s'\r\n"), lpdev->pszDeviceName != NULL ? lpdev->pszDeviceName : L"<Unnamed>"));
DEBUGCHK(FALSE);
}
}
}
DEBUGMSG(ZONE_PNP,(TEXT("Calling PmPowerHandler Off \r\n")));
PmPowerHandler(bOff);
} else {
// Notify drivers of power on according in the same order as they
// were loaded.
DEBUGMSG(ZONE_PNP,(TEXT("Calling PmPowerHandler On \r\n")));
PmPowerHandler(bOff);
for (lpdev = (fsdev_t *)g_DevChain.Flink;
lpdev != (fsdev_t *)&g_DevChain;
lpdev = (fsdev_t *)lpdev->list.Flink) {
if (lpdev->fnPowerup) {
DEBUGMSG(ZONE_PNP,(TEXT("Calling \'%s\' PowerUp at 0x%x\r\n"),
lpdev->pszDeviceName != NULL ? lpdev->pszDeviceName : L"<Unnamed>", lpdev->fnPowerdn));
__try {
lpdev->fnPowerup(lpdev->dwData);
}
__except(EXCEPTION_EXECUTE_HANDLER) {
DEBUGMSG(ZONE_ERROR,(TEXT("DEVICE! Exception calling PowerUp for '%s'\r\n"), lpdev->pszDeviceName != NULL ? lpdev->pszDeviceName : L"<Unnamed>"));
DEBUGCHK(FALSE);
}
}
}
}
}
// This routine allows the caller to enumerate through loaded devices by
// calling FindFirstFileEx/FindNextFile (using the FindExSearchLimitToDevices
// extended search flag). It loads the lpFindFileData structure with
// the name of the device (e.g., "COM1:").
BOOL DM_GetDeviceByIndex(DWORD dwIndex, LPWIN32_FIND_DATA lpFindFileData) {
fsdev_t *lpdev;
BOOL bRet = FALSE;
// sanity check parameters
if(lpFindFileData == NULL) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
EnterCriticalSection(&g_devcs);
__try {
lpdev = (fsdev_t *)g_DevChain.Flink;
while (lpdev != (fsdev_t *)&g_DevChain) {
if(lpdev->pszLegacyName != NULL) {
if(dwIndex == 0) {
break;
} else {
dwIndex--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -