devload.c

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

C
1,205
字号
    ){    BOOL bRet;    HKEY DevKey;    HKEY MultiKey;    DWORD status;    DWORD RegEnum;    DWORD ValLen;    DWORD ValLen1;    LPTSTR  RegPathPtr;        DEBUGMSG(ZONE_ACTIVE,        (TEXT("DEVICE!StartDriver starting HLM\\%s.\r\n"), RegPath));    status = RegOpenKeyEx(                HKEY_LOCAL_MACHINE,                RegPath,                0,                0,                &DevKey);    if (status) {        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartDriver RegOpenKeyEx(%s) returned %d.\r\n"),            RegPath, status));        return FALSE;    }    //    // If the "MULTI" key exists below this driver, then load the list of    // drivers under this key.    //    status = RegOpenKeyEx(                DevKey,                TEXT("MULTI"),                0,                0,                &MultiKey);    RegCloseKey(DevKey);    if (status) {        //        // No "MULTI" key, just load the driver like we used to.        //        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartDriver Loading %s (key x%X, status %d).\r\n"), RegPath, DevKey, status));        return StartOneDriver(RegPath, PnpId, LoadOrder, 0, hSock) == NULL ?                    FALSE : TRUE;    }    //    // Add "\\MULTI\\" to the registry path    //    DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,             (TEXT("DEVICE!StartDriver RegPath %s\r\n"),              RegPath));    RegPathPtr = RegPath + _tcslen(RegPath);    _tcscat(RegPath, TEXT("\\MULTI\\"));    RegPathPtr = RegPath + _tcslen(RegPath);    DEBUGMSG(ZONE_ACTIVE,        (TEXT("DEVICE!StartDriver walking HLM\\%s.\r\n"), RegPath));        //    // Walk the device keys under the "MULTI" key, calling StartOneDriver for    // each one.    //    bRet = FALSE;    RegEnum = 0;    ValLen = REG_PATH_LEN - (RegPathPtr - RegPath);  // ValLen is in TCHAR units, not bytes    while (1) {        ValLen1 = ValLen;        status = RegEnumKeyEx(                    MultiKey,                    RegEnum,                    RegPathPtr,                    &ValLen1,                    NULL,                    NULL,                    NULL,                    NULL);        if (status != ERROR_SUCCESS) {            DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,                     (TEXT("DEVICE!StartDriver RegEnumKeyEx(%s) returned %d.\r\n"),                      RegPath, status));            RegCloseKey(MultiKey);            return bRet;        }        DEBUGMSG(ZONE_ACTIVE|ZONE_ERROR,            (TEXT("DEVICE!StartDriver Loading %s.\r\n"), RegPath));        if (StartOneDriver(RegPath, PnpId, LoadOrder, RegEnum, hSock)) {            bRet = TRUE;        }        RegEnum++;    }        return bRet;  // should never get here.}   // StartDriver//// Function to load device drivers for built-in devices.//VOIDInitDevices(VOID){    HKEY BuiltInKey;    HKEY DevKey;    DWORD DevLoadOrder;    DWORD LoadOrder;    DWORD NumDevKeys;    DWORD RegEnum;    DWORD status;    DWORD ValType;    DWORD ValLen;    BOOL  bKeepLib;    TCHAR DevDll[DEVDLL_LEN];    TCHAR DevEntry[DEVENTRY_LEN];    TCHAR DevName[DEVNAME_LEN];    TCHAR RegPath[REG_PATH_LEN];    TCHAR * RegPathPtr;    HMODULE hDevDll;    PFN_DEV_ENTRY DevEntryFn;    CARD_SOCKET_HANDLE hSock;    //    // Open the built-in device registry key    //    status = RegOpenKeyEx(                HKEY_LOCAL_MACHINE,                s_BuiltInKey,                0,                0,                &BuiltInKey);    if (status) {        DEBUGMSG(ZONE_BUILTIN|ZONE_ERROR,            (TEXT("DEVICE!InitDevices RegOpenKeyEx(BuiltIn) returned %d.\r\n"),            status));        return;    }    //    // See how many built-in devices there are    //    RegEnum = sizeof(DevDll);    status = RegQueryInfoKey(                    BuiltInKey,                    DevDll,         // class name buffer (lpszClass)                    &RegEnum,       // ptr to length of class name buffer (lpcchClass)                    NULL,           // reserved                    &NumDevKeys,    // ptr to number of subkeys (lpcSubKeys)                    &ValType,       // ptr to longest subkey name length (lpcchMaxSubKeyLen)                    &ValLen,        // ptr to longest class string length (lpcchMaxClassLen)                    &LoadOrder,     // ptr to number of value entries (lpcValues)                    &DevLoadOrder,  // ptr to longest value name length (lpcchMaxValueNameLen)                    &ValLen,        // ptr to longest value data length (lpcbMaxValueData)                    NULL,           // ptr to security descriptor length                    NULL);          // ptr to last write time    if (status != ERROR_SUCCESS) {        DEBUGMSG(ZONE_BUILTIN|ZONE_ERROR,            (TEXT("DEVICE!InitDevices RegQueryInfoKey(Class) returned %d.\r\n"),            status));        goto id_end;    }    DEBUGMSG(ZONE_BUILTIN,        (TEXT("DEVICE!InitDevices %d devices to load\r\n"), NumDevKeys));    //    // Setup registry path name string    //    _tcscpy(RegPath, s_BuiltInKey);    RegPathPtr = RegPath + _tcslen(RegPath);    *RegPathPtr = (TCHAR)'\\';    RegPathPtr++;   // leave this pointing after the '\\'    //    // Read the built-in device list from the registry and start the drivers    // according to their load order.    //    RegEnum = 0;    LoadOrder = 0;    DEBUGMSG(ZONE_BUILTIN,        (TEXT("DEVICE!InitDevices LoadOrder = %d\r\n"), LoadOrder));    while (NumDevKeys) {        ValLen = sizeof(DevName) / sizeof(TCHAR);        status = RegEnumKeyEx(                    BuiltInKey,                    RegEnum,                    DevName,                    &ValLen,                    NULL,                    NULL,                    NULL,                    NULL);        if (status != ERROR_SUCCESS) {            //            // Assume all keys have been enumerated and start over using the            // next load order.            //            RegEnum = 0;            LoadOrder++;            DEBUGMSG(ZONE_BUILTIN,                (TEXT("DEVICE!InitDevices LoadOrder = %d\r\n"), LoadOrder));            if (LoadOrder == MAX_LOAD_ORDER) {                goto id_end;            }            continue;        }        status = RegOpenKeyEx(                    BuiltInKey,                    DevName,                    0,                    0,                    &DevKey);        if (status != ERROR_SUCCESS) {            DEBUGMSG(ZONE_BUILTIN|ZONE_ERROR,                (TEXT("DEVICE!InitDevices RegOpenKeyEx(%s) returned %d\r\n"),                DevName, status));            goto id_next_dev1;        }        //        // Check the load order (required)        //        ValLen = sizeof(DevLoadOrder);        status = RegQueryValueEx(                    DevKey,                    DEVLOAD_LOADORDER_VALNAME,                    NULL,                    &ValType,                    (PUCHAR)&DevLoadOrder,                    &ValLen);        if (status != ERROR_SUCCESS) {            DEBUGMSG(ZONE_BUILTIN|ZONE_ERROR,                (TEXT("DEVICE!InitDevices RegQueryValueEx(%s\\LoadOrder) returned %d\r\n"),                DevName, status));            goto id_next_dev;        }        if (DevLoadOrder != LoadOrder) {            goto id_next_dev;   // Don't load this device now.        }        //        // If the entrypoint value exists, then devload will load the dll and call the        // entrypoint function.  The dll device must then call RegisterDevice.        //        ValLen = sizeof(DevEntry);        status = RegQueryValueEx(                    DevKey,                    DEVLOAD_ENTRYPOINT_VALNAME,                    NULL,                    &ValType,                    (PUCHAR)DevEntry,                    &ValLen);        if (status != ERROR_SUCCESS) {            goto id_register;        }        //        // If the keeplib value is present, then do not call FreeLibrary after        // calling the device's specified entrypoint.        //        ValLen = sizeof(DevDll);        bKeepLib = (RegQueryValueEx(                    DevKey,                    DEVLOAD_KEEPLIB_VALNAME,                    NULL,                    &ValType,                    (PUCHAR)DevDll,                    &ValLen) == ERROR_SUCCESS) ? TRUE:FALSE;        //        // Read the DLL name (required)        //        ValLen = sizeof(DevDll);        status = RegQueryValueEx(                    DevKey,                    s_DllName_ValName,                    NULL,                    &ValType,                    (PUCHAR)DevDll,                    &ValLen);        if (status != ERROR_SUCCESS) {            DEBUGMSG(ZONE_BUILTIN|ZONE_ERROR,                (TEXT("DEVICE!InitDevices RegQueryValueEx(%s\\DllName) returned %d\r\n"),                DevName, status));            goto id_next_dev;        }        //        // Load the device now.        //        hDevDll = LoadDriver(DevDll);        if (hDevDll == NULL) {            DEBUGMSG(ZONE_BUILTIN|ZONE_ERROR,                (TEXT("DEVICE!InitDevices LoadDriver(%s) failed %d\r\n"),                DevDll, GetLastError()));            goto id_next_dev;        }        DevEntryFn = (PFN_DEV_ENTRY)GetProcAddress(hDevDll, DevEntry);        if (DevEntryFn == NULL) {            DEBUGMSG(ZONE_BUILTIN|ZONE_ERROR,                (TEXT("DEVICE!InitDevices GetProcAddr(%s, %s) failed %d\r\n"),                DevDll, DevEntry, GetLastError()));            FreeLibrary(hDevDll);            goto id_next_dev;        }        //        // Finally, call the device's initialization entrypoint        //        _tcscpy(RegPathPtr, DevName);        (DevEntryFn)(RegPath);        NumDevKeys--;        if (bKeepLib == FALSE) {            FreeLibrary(hDevDll);        }        goto id_next_dev;id_register:        //        // The device key did not contain an entrypoint value.        // This means the device wants devload to call RegisterDevice for it.        //        _tcscpy(RegPathPtr, DevName);        hSock.uSocket = 0xff;   // This indicates to StartDriver to not        hSock.uFunction = 0xff; // add the socket value in the active key        StartDriver(            RegPath,            NULL,           // BuiltIn devices have no PNP Id            LoadOrder,            hSock            );        NumDevKeys--;id_next_dev:        RegCloseKey(DevKey);id_next_dev1:        RegEnum++;    }   // while (more device keys to try)id_end:    RegCloseKey(BuiltInKey);}   // InitDevices//// Called from device.c after it initializes.//void DevloadInit(void){	DEBUGREGISTER(NULL);    DEBUGMSG(ZONE_INIT, (TEXT("DEVICE!DevloadInit\r\n")));    //    // Delete the HLM\Drivers\Active key since there are no active devices at    // init time.    //    RegDeleteKey(HKEY_LOCAL_MACHINE, s_ActiveKey);    v_NextDeviceNum = 0;    v_hTapiDLL = NULL;    v_hCoreDLL = NULL;    g_bSystemInitd = FALSE;    InitPCMCIA();    InitDevices();    InitTAPIDevices();}//// Called from device.c after the system has initialized.//void DevloadPostInit(void){    SYSTEMINIT pfnCardSystemInit;    if (g_bSystemInitd) {        DEBUGMSG(ZONE_INIT, (TEXT("DEVICE!DevloadPostInit: multiple DLL_SYSTEM_STARTED msgs!!!\r\n")));        return;    }    g_bSystemInitd = TRUE;    DEBUGMSG(ZONE_INIT, (TEXT("DEVICE!DevloadPostInit\r\n")));    //    // Indicate to pcmcia.dll that the system has initialized.    //    pfnCardSystemInit = (SYSTEMINIT) GetProcAddress(v_hPcmciaDll, TEXT("CardSystemInit"));    if (pfnCardSystemInit) {        pfnCardSystemInit();    }}

⌨️ 快捷键说明

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