devload.c

来自「wince下的源代码集合打包」· C语言 代码 · 共 1,205 行 · 第 1/3 页

C
1,205
字号
// Return the HANDLE from RegisterDevice.//HANDLEStartOneDriver(    LPTSTR  RegPath,    LPTSTR  PnpId,    DWORD   LoadOrder,    DWORD   ClientInfo,    CARD_SOCKET_HANDLE hSock    ){    BOOL bUseContext;    BOOL bFoundIndex;    HKEY ActiveKey;    HKEY DevKey;    DWORD Context;    DWORD Disposition;    DWORD Handle;    DWORD Index;    DWORD status;    DWORD ValLen;    DWORD ValType;    LPTSTR str;    TCHAR ActivePath[REG_PATH_LEN];    TCHAR DevDll[DEVDLL_LEN];    TCHAR DevName[DEVNAME_LEN];    TCHAR DevNum[DEVNAME_LEN];    TCHAR Prefix[DEVPREFIX_LEN];    fsdev_t * lpdev;    DEBUGMSG(ZONE_ACTIVE,        (TEXT("DEVICE!StartOneDriver starting HLM\\%s.\r\n"), RegPath));    //    // Get the required (dll and prefix) and optional (index and context) values.    //    status = RegCreateKeyEx(                HKEY_LOCAL_MACHINE,                RegPath,                0,                NULL,                REG_OPTION_NON_VOLATILE,                0,                NULL,                &DevKey,     // HKEY result                &Disposition);    if (status) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegCreateKeyEx(%s) returned %d.\r\n"),            RegPath, status));        return NULL;    }    ValLen = sizeof(DevDll);    status = RegQueryValueEx(                DevKey,                s_DllName_ValName,                NULL,                &ValType,                (PUCHAR)DevDll,                &ValLen);    if (status != ERROR_SUCCESS) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegQueryValueEx(%s\\DllName) returned %d\r\n"),            RegPath, status));        RegCloseKey(DevKey);        return NULL; // dll name is required    }    ValLen = sizeof(Prefix);    status = RegQueryValueEx(                DevKey,                DEVLOAD_PREFIX_VALNAME,                NULL,                &ValType,                (PUCHAR)Prefix,                &ValLen);    if (status != ERROR_SUCCESS) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegQueryValueEx(%s\\Prefix) returned %d\r\n"),            RegPath, status));        RegCloseKey(DevKey);        return NULL; // Prefix is required    }    //    // Read the optional index and context values    //    ValLen = sizeof(Index);    status = RegQueryValueEx(                DevKey,                DEVLOAD_INDEX_VALNAME,                NULL,                &ValType,                (PUCHAR)&Index,                &ValLen);    if (status != ERROR_SUCCESS) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegQueryValueEx(%s\\Index) returned %d\r\n"),            RegPath, status));        Index = (DWORD)-1;     // devload will find an index to use    }    bUseContext = TRUE;    ValLen = sizeof(Context);    status = RegQueryValueEx(                DevKey,                DEVLOAD_CONTEXT_VALNAME,                NULL,                &ValType,                (PUCHAR)&Context,                &ValLen);    if (status != ERROR_SUCCESS) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegQueryValueEx(%s\\Context) returned %d\r\n"),            RegPath, status));        bUseContext = FALSE;    // context is pointer to active reg path string    }    //    // Format the key's registry path (HLM\Drivers\Active\nnnn)    //    _tcscpy(ActivePath, s_ActiveKey);    _tcscat(ActivePath, TEXT("\\"));    wsprintf(DevNum, TEXT("%02d"), v_NextDeviceNum);    _tcscat(ActivePath, DevNum);    v_NextDeviceNum++;    DEBUGMSG(ZONE_ACTIVE,        (TEXT("DEVICE!StartOneDriver Adding HLM\\%s.\r\n"), ActivePath));    //    // Create a new key in the active list    //    status = RegCreateKeyEx(                HKEY_LOCAL_MACHINE,                ActivePath,                0,                NULL,                REG_OPTION_NON_VOLATILE,                0,                NULL,                &ActiveKey,     // HKEY result                &Disposition);    if (status) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegCreateKeyEx(%s) returned %d.\r\n"),            ActivePath, status));        RegCloseKey(DevKey);        return NULL;    }    //    // Default context is registry path    //    if (bUseContext == FALSE) {        Context = (DWORD)ActivePath;    }    //    // Install pnp id, socket and key name values in the device's active registry key.    // (handle and device name are added after RegisterDevice())    //    //    // Registry path of the device driver (from HLM\Drivers\BuiltIn or HLM\Drivers\PCMCIA)    //    if (RegPath != NULL) {            status = RegSetValueEx(                    ActiveKey,                    DEVLOAD_DEVKEY_VALNAME,                    0,                    DEVLOAD_DEVKEY_VALTYPE,                    (PBYTE)RegPath,                    sizeof(TCHAR)*(_tcslen(RegPath) + sizeof(TCHAR)));        if (status) {            DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,                (TEXT("DEVICE!StartOneDriver RegSetValueEx(%s) returned %d.\r\n"),                DEVLOAD_DEVKEY_VALNAME, status));        }    }    //    // Plug and Play Id string    //    if (PnpId != NULL) {        status = RegSetValueEx(                    ActiveKey,                    DEVLOAD_PNPID_VALNAME,                    0,                    DEVLOAD_PNPID_VALTYPE,                    (PBYTE)PnpId,                    sizeof(TCHAR)*(_tcslen(PnpId) + sizeof(TCHAR)));        if (status) {            DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,                (TEXT("DEVICE!StartOneDriver RegSetValueEx(%s) returned %d.\r\n"),                DEVLOAD_PNPID_VALNAME, status));        }    }    //    // Socket and function number of this device    //    if (hSock.uSocket != 0xff) {        status = RegSetValueEx(                    ActiveKey,                    DEVLOAD_SOCKET_VALNAME,                    0,                    DEVLOAD_SOCKET_VALTYPE,                    (PBYTE)&hSock,                    sizeof(hSock));        if (status) {            DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,                (TEXT("DEVICE!StartOneDriver RegSetValueEx(%s) returned %d.\r\n"),                DEVLOAD_SOCKET_VALNAME, status));        }    }    //    // Add ClientInfo from ActivateDevice    //    status = RegSetValueEx(                ActiveKey,                DEVLOAD_CLIENTINFO_VALNAME,                0,                DEVLOAD_CLIENTINFO_VALTYPE,                (PBYTE)&ClientInfo,                sizeof(DWORD));    if (status) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegSetValueEx(%s) returned %d.\r\n"),            DEVLOAD_CLIENTINFO_VALNAME, status));    }    if (Index == -1) {        //        // Find the first available index for this device prefix.        //        bFoundIndex = FALSE;        Index = 1;  // device index (run it through 1-9 and then 0)        EnterCriticalSection(&g_devcs);        while (!bFoundIndex) {            bUseContext = FALSE; // reuse this flag for this loop.            for (lpdev = (fsdev_t *)g_DevChain.Flink;                lpdev != (fsdev_t *)&g_DevChain;                lpdev = (fsdev_t *)lpdev->list.Flink) {                if (!memcmp(Prefix, lpdev->type, sizeof(lpdev->type))) {                    if (lpdev->index == Index) {                        bUseContext = TRUE;                        break;                    }                }            }            if (!bUseContext) {                //                // No other devices of this prefix are using this index.                //                bFoundIndex = TRUE;                DEBUGMSG(ZONE_ACTIVE,                    (TEXT("DEVICE:StartOneDriver using index %d for new %s device\r\n"),                    Index, Prefix));                break;            }            if (Index == 0) {   // There are no more indexes to try after 0                break;            }            Index++;            if (Index == 10) {                Index = 0;       // Try 0 as the last index            }        }   // while (trying device indexes)        LeaveCriticalSection(&g_devcs);    } else {        bFoundIndex = TRUE;    }    if (bFoundIndex) {        //        // Format device name from prefix and index and write it to registry        //        _tcscpy(DevName, Prefix);        str = DevName + _tcslen(DevName);        str[0] = (TCHAR)Index + (TCHAR)'0';        str[1] = (TCHAR)':';        str[2] = (TCHAR)0;        status = RegSetValueEx(                    ActiveKey,                    DEVLOAD_DEVNAME_VALNAME,                    0,                    DEVLOAD_DEVNAME_VALTYPE,                    (PBYTE)DevName,                    sizeof(TCHAR)*(_tcslen(DevName) + sizeof(TCHAR)));        if (status) {            DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,                (TEXT("DEVICE!StartOneDriver RegSetValueEx(%s) returned %d.\r\n"),                DEVLOAD_DEVNAME_VALNAME, status));        }    #ifdef TARGET_NT        Handle = (DWORD)RegisterDevice(                            Prefix,                            Index,                            DevDll,                            Context);#else        Handle = (DWORD)RegisterDeviceEx(                            Prefix,                            Index,                            DevDll,                            Context,                            LoadOrder                            );#endif // TARGET_NT    } else {        Handle = 0;    }    if (Handle == 0) {        //        // RegisterDevice failed        //        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegisterDevice(%s, %d, %s, 0x%x) failed\r\n"),            Prefix, Index, DevDll, Context));        RegCloseKey(DevKey);        RegCloseKey(ActiveKey);        RegDeleteKey(HKEY_LOCAL_MACHINE, ActivePath);        return NULL;    }    //    // Add handle from RegisterDevice()    //    status = RegSetValueEx(                ActiveKey,                DEVLOAD_HANDLE_VALNAME,                0,                DEVLOAD_HANDLE_VALTYPE,                (PBYTE)&Handle,                sizeof(Handle));    if (status) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegSetValueEx(%s) returned %d.\r\n"),            DEVLOAD_HANDLE_VALNAME, status));    }    CallTapiDeviceChange(ActiveKey, DevName, FALSE); // bDelete == FALSE    //    // Determine whether this device wants a post init ioctl    //    ValLen = sizeof(Context);    status = RegQueryValueEx(                DevKey,                DEVLOAD_INITCODE_VALNAME,                NULL,                &ValType,                (PUCHAR)&Context,                &ValLen);    if (status != ERROR_SUCCESS) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartOneDriver RegQueryValueEx(%s\\InitCode) returned %d\r\n"),            RegPath, status));    } else {        //        // Call the new device's IOCTL_DEVICE_INITIALIZED         //        DevicePostInit(DevName, Context, Handle, DevKey);    }    RegCloseKey(DevKey);    RegCloseKey(ActiveKey);    //    // Notify only for new PCMCIA devices    //#ifndef TARGET_NT    if (hSock.uSocket != 0xff) {        StartDeviceNotify(DevName, TRUE);    }#endif // TARGET_NT    return (HANDLE)Handle;}   // StartOneDriver//// Function to RegisterDevice a device driver and add it to the active device list// in HLM\Drivers\Active and then signal the system that a new device is available.//// Return TRUE if the RegisterDevice call succeeded.//BOOLStartDriver(    LPTSTR  RegPath,    LPTSTR  PnpId,    DWORD   LoadOrder,    CARD_SOCKET_HANDLE hSock

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?