BOOLEAN ProcessKeyboardLayoutRegistry( PGENERIC_LIST List) { PGENERIC_LIST_ENTRY Entry; PWCHAR LayoutId; const MUI_LAYOUTS * LayoutsList; MUI_LAYOUTS NewLayoutsList[20]; ULONG uIndex; ULONG uOldPos = 0; Entry = GetCurrentListEntry(List); if (Entry == NULL) return FALSE; LayoutId = (PWCHAR)GetListEntryUserData(Entry); if (LayoutId == NULL) return FALSE; LayoutsList = MUIGetLayoutsList(); if (_wcsicmp(LayoutsList[0].LayoutID, LayoutId) != 0) { for (uIndex = 1; LayoutsList[uIndex].LangID != NULL; uIndex++) { if (_wcsicmp(LayoutsList[uIndex].LayoutID, LayoutId) == 0) { uOldPos = uIndex; continue; } NewLayoutsList[uIndex].LangID = LayoutsList[uIndex].LangID; NewLayoutsList[uIndex].LayoutID = LayoutsList[uIndex].LayoutID; } NewLayoutsList[uIndex].LangID = NULL; NewLayoutsList[uIndex].LayoutID = NULL; NewLayoutsList[uOldPos].LangID = LayoutsList[0].LangID; NewLayoutsList[uOldPos].LayoutID = LayoutsList[0].LayoutID; NewLayoutsList[0].LangID = LayoutsList[uOldPos].LangID; NewLayoutsList[0].LayoutID = LayoutsList[uOldPos].LayoutID; return AddKbLayoutsToRegistry(NewLayoutsList); } return TRUE; }
BOOLEAN ProcessComputerFiles(HINF InfFile, PGENERIC_LIST List, PWCHAR* AdditionalSectionName) { PGENERIC_LIST_ENTRY Entry; static WCHAR SectionName[128]; DPRINT("ProcessComputerFiles() called\n"); Entry = GetCurrentListEntry(List); if (Entry == NULL) { DPRINT("GetCurrentListEntry() failed\n"); return FALSE; } wcscpy(SectionName, L"Files."); wcscat(SectionName, (const wchar_t*)GetListEntryUserData(Entry)); *AdditionalSectionName = SectionName; return TRUE; }
BOOLEAN ProcessLocaleRegistry(PGENERIC_LIST List) { PGENERIC_LIST_ENTRY Entry; PWCHAR LanguageId; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING KeyName; UNICODE_STRING ValueName; HANDLE KeyHandle; NTSTATUS Status; Entry = GetCurrentListEntry(List); if (Entry == NULL) return FALSE; LanguageId = (PWCHAR)GetListEntryUserData(Entry); if (LanguageId == NULL) return FALSE; /* Skip first 4 zeroes */ if (wcslen(LanguageId) >= 4) LanguageId += 4; /* Open the NLS language key */ RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\Language"); InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, NULL, NULL); Status = NtOpenKey(&KeyHandle, KEY_SET_VALUE, &ObjectAttributes); if (!NT_SUCCESS(Status)) { DPRINT1("NtOpenKey() failed (Status %lx)\n", Status); return FALSE; } /* Set default language */ RtlInitUnicodeString(&ValueName, L"Default"); Status = NtSetValueKey(KeyHandle, &ValueName, 0, REG_SZ, (PVOID)LanguageId, (wcslen(LanguageId) + 1) * sizeof(WCHAR)); if (!NT_SUCCESS(Status)) { DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); NtClose(KeyHandle); return FALSE; } /* Set install language */ RtlInitUnicodeString(&ValueName, L"InstallLanguage"); Status = NtSetValueKey (KeyHandle, &ValueName, 0, REG_SZ, (PVOID)LanguageId, (wcslen(LanguageId) + 1) * sizeof(WCHAR)); NtClose(KeyHandle); if (!NT_SUCCESS(Status)) { DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); return FALSE; } return TRUE; }
BOOLEAN ProcessDisplayRegistry(HINF InfFile, PGENERIC_LIST List) { PGENERIC_LIST_ENTRY Entry; INFCONTEXT Context; PWCHAR ServiceName; ULONG StartValue; NTSTATUS Status; WCHAR RegPath [255]; PWCHAR Buffer; ULONG Width, Height, Bpp; DPRINT("ProcessDisplayRegistry() called\n"); Entry = GetCurrentListEntry(List); if (Entry == NULL) { DPRINT("GetCurrentListEntry() failed\n"); return FALSE; } if (!SetupFindFirstLineW(InfFile, L"Display", (WCHAR*)GetListEntryUserData(Entry), &Context)) { DPRINT("SetupFindFirstLineW() failed\n"); return FALSE; } /* Enable the right driver */ if (!INF_GetDataField(&Context, 3, &ServiceName)) { DPRINT("INF_GetDataField() failed\n"); return FALSE; } ASSERT(wcslen(ServiceName) < 10); DPRINT("Service name: %S\n", ServiceName); StartValue = 1; Status = RtlWriteRegistryValue(RTL_REGISTRY_SERVICES, ServiceName, L"Start", REG_DWORD, &StartValue, sizeof(ULONG)); if (!NT_SUCCESS(Status)) { DPRINT("RtlWriteRegistryValue() failed (Status %lx)\n", Status); return FALSE; } /* Set the resolution */ swprintf(RegPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Services\\%s\\Device0", ServiceName); if (!INF_GetDataField(&Context, 4, &Buffer)) { DPRINT("INF_GetDataField() failed\n"); return FALSE; } Width = wcstoul(Buffer, NULL, 10); Status = RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE, RegPath, L"DefaultSettings.XResolution", REG_DWORD, &Width, sizeof(ULONG)); if (!NT_SUCCESS(Status)) { DPRINT("RtlWriteRegistryValue() failed (Status %lx)\n", Status); return FALSE; } if (!INF_GetDataField(&Context, 5, &Buffer)) { DPRINT("INF_GetDataField() failed\n"); return FALSE; } Height = wcstoul(Buffer, 0, 0); Status = RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE, RegPath, L"DefaultSettings.YResolution", REG_DWORD, &Height, sizeof(ULONG)); if (!NT_SUCCESS(Status)) { DPRINT("RtlWriteRegistryValue() failed (Status %lx)\n", Status); return FALSE; } if (!INF_GetDataField(&Context, 6, &Buffer)) { DPRINT("INF_GetDataField() failed\n"); return FALSE; } Bpp = wcstoul(Buffer, 0, 0); Status = RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE, RegPath, L"DefaultSettings.BitsPerPel", REG_DWORD, &Bpp, sizeof(ULONG)); if (!NT_SUCCESS(Status)) { DPRINT("RtlWriteRegistryValue() failed (Status %lx)\n", Status); return FALSE; } DPRINT("ProcessDisplayRegistry() done\n"); return TRUE; }