// Get registry key of the network class data by GUID bool GetClassRegKeyWin32(char *key, UINT key_size, char *short_key, UINT short_key_size, char *guid) { TOKEN_LIST *t; bool ret = false; UINT i; // Validate arguments if (key == NULL || short_key == NULL || guid == NULL) { return false; } t = MsRegEnumKey(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}"); if (t == NULL) { return false; } for (i = 0;i < t->NumTokens;i++) { char keyname[MAX_SIZE]; char *value; Format(keyname, sizeof(keyname), "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s", t->Token[i]); value = MsRegReadStr(REG_LOCAL_MACHINE, keyname, "NetCfgInstanceId"); if (StrCmpi(value, guid) == 0) { ret = true; StrCpy(key, key_size, keyname); Format(short_key, short_key_size, "{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s", t->Token[i]); } Free(value); } FreeToken(t); return ret; }
// Get the device instance id from short_key char *SearchDeviceInstanceIdFromShortKey(char *short_key) { char *ret = NULL; TOKEN_LIST *t1; // Validate arguments if (short_key == NULL) { return NULL; } t1 = MsRegEnumKey(REG_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Enum"); if (t1 != NULL) { TOKEN_LIST *t2; char tmp[MAX_SIZE]; UINT i; for (i = 0;i < t1->NumTokens;i++) { Format(tmp, sizeof(tmp), "SYSTEM\\CurrentControlSet\\Enum\\%s", t1->Token[i]); t2 = MsRegEnumKey(REG_LOCAL_MACHINE, tmp); if (t2 != NULL) { TOKEN_LIST *t3; UINT i; for (i = 0;i < t2->NumTokens;i++) { char tmp2[MAX_SIZE]; Format(tmp2, sizeof(tmp2), "%s\\%s", tmp, t2->Token[i]); t3 = MsRegEnumKey(REG_LOCAL_MACHINE, tmp2); if (t3 != NULL) { UINT i; for (i = 0;i < t3->NumTokens;i++) { char tmp3[MAX_SIZE]; char *s; Format(tmp3, sizeof(tmp3), "%s\\%s", tmp2, t3->Token[i]); s = MsRegReadStr(REG_LOCAL_MACHINE, tmp3, "Driver"); if (s != NULL) { if (StrCmpi(s, short_key) == 0) { if (ret != NULL) { Free(ret); } ret = CopyStr(tmp3 + StrLen("SYSTEM\\CurrentControlSet\\Enum\\")); } Free(s); } } FreeToken(t3); } } FreeToken(t2); } } FreeToken(t1); } return ret; }
// Load the device module bool Win32LoadSecModule(SECURE *sec) { SEC_DATA_WIN32 *w; HINSTANCE hInst; CK_FUNCTION_LIST_PTR api = NULL; CK_RV (*get_function_list)(CK_FUNCTION_LIST_PTR_PTR); // Validate arguments if (sec == NULL) { return false; } if (sec->Dev->Id == 9) { char username[MAX_SIZE]; DWORD size; // Because the device driver of Juki-Net needs the contents // of the Software\JPKI registry key on HKLU of SYSTEM, // if there is no key, copy the key from the value of other user // if (MsRegIsValue(REG_CURRENT_USER, "Software\\JPKI", "Name") == false || // MsRegIsValue(REG_CURRENT_USER, "Software\\JPKI", "RWType") == false) size = sizeof(username); GetUserName(username, &size); if (StrCmpi(username, "System") == 0) { TOKEN_LIST *t = MsRegEnumKey(REG_USERS, NULL); if (t != NULL) { UINT i; for (i = 0;i < t->NumTokens;i++) { char tmp[MAX_PATH]; if (StrCmpi(t->Token[i], ".DEFAULT") != 0 && StrCmpi(t->Token[i], "S-1-5-18") != 0) { Format(tmp, sizeof(tmp), "%s\\Software\\JPKI", t->Token[i]); if (MsRegIsValue(REG_USERS, tmp, "Name") && MsRegIsValue(REG_USERS, tmp, "RWType")) { char *name = MsRegReadStr(REG_USERS, tmp, "Name"); char *port = MsRegReadStr(REG_USERS, tmp, "Port"); UINT type = MsRegReadInt(REG_USERS, tmp, "RWType"); MsRegWriteStr(REG_CURRENT_USER, "Software\\JPKI", "Name", name); MsRegWriteStr(REG_CURRENT_USER, "Software\\JPKI", "Port", port); MsRegWriteInt(REG_CURRENT_USER, "Software\\JPKI", "RWType", type); Free(name); Free(port); break; } } } FreeToken(t); } } } // Load the Library hInst = Win32SecureLoadLibraryEx(sec->Dev->ModuleName, 0); if (hInst == NULL) { // Failure return false; } // Get the API get_function_list = (CK_RV (*)(CK_FUNCTION_LIST_PTR_PTR)) GetProcAddress(hInst, "C_GetFunctionList"); if (get_function_list == NULL) { // Failure FreeLibrary(hInst); return false; } get_function_list(&api); if (api == NULL) { // Failure FreeLibrary(hInst); return false; } sec->Data = ZeroMalloc(sizeof(SEC_DATA_WIN32)); w = sec->Data; w->hInst = hInst; sec->Api = api; return true; }