+ Status = NtCreateKey(&DbKey, KeyAccess, &ObjectKey, 0, NULL, 0, NULL);
+ if (NT_SUCCESS(Status))
+ {
+ UNICODE_STRING DatabasePathKey = RTL_CONSTANT_STRING(L"DatabasePath");
+ UNICODE_STRING DatabaseInstallTimeStampKey = RTL_CONSTANT_STRING(L"DatabaseInstallTimeStamp");
+ UNICODE_STRING DatabaseTypeKey = RTL_CONSTANT_STRING(L"DatabaseType");
+ UNICODE_STRING DatabaseDescriptionKey = RTL_CONSTANT_STRING(L"DatabaseDescription");
+
+ Status = NtSetValueKey(DbKey, &DatabasePathKey, 0, REG_SZ,
+ (PVOID)pszDatabasePath, (wcslen(pszDatabasePath) + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ SHIM_ERR("Unable to write %wZ\n", &DatabasePathKey);
+
+ if (NT_SUCCESS(Status))
+ {
+ ULARGE_INTEGER ulTimeStamp;
+ if (pTimeStamp)
+ {
+ ulTimeStamp.QuadPart = *pTimeStamp;
+ }
+ else
+ {
+ FILETIME fi;
+ GetSystemTimeAsFileTime(&fi);
+ ulTimeStamp.LowPart = fi.dwLowDateTime;
+ ulTimeStamp.HighPart = fi.dwHighDateTime;
+ }
+ Status = NtSetValueKey(DbKey, &DatabaseInstallTimeStampKey, 0, REG_QWORD,
+ &ulTimeStamp.QuadPart, sizeof(ulTimeStamp));
+ if (!NT_SUCCESS(Status))
+ SHIM_ERR("Unable to write %wZ\n", &DatabaseInstallTimeStampKey);
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ Status = NtSetValueKey(DbKey, &DatabaseTypeKey, 0, REG_DWORD,
+ &dwDatabaseType, sizeof(dwDatabaseType));
+ if (!NT_SUCCESS(Status))
+ SHIM_ERR("Unable to write %wZ\n", &DatabaseTypeKey);
+ }
+
+ if (NT_SUCCESS(Status) && Information.Description)
+ {
+ Status = NtSetValueKey(DbKey, &DatabaseDescriptionKey, 0, REG_SZ,
+ (PVOID)Information.Description, (wcslen(Information.Description) + 1) * sizeof(WCHAR));
+ if (!NT_SUCCESS(Status))
+ SHIM_ERR("Unable to write %wZ\n", &DatabaseDescriptionKey);
+ }
+
+ NtClose(DbKey);
+
+ if (NT_SUCCESS(Status))
+ {
+ SHIM_INFO("Installed %wS as %wZ\n", pszDatabasePath, &KeyName);
+ }
+ }
+ else
+ {
+ SHIM_ERR("Unable to create key %wZ\n", &KeyName);
+ }
+
+ NtClose(InstalledSDBKey);
+ }
+ else
+ {
+ SHIM_ERR("Unable to create key %wZ\n", &KeyName);
+ }
+
+ SdbFreeDatabaseInformation(&Information);
+ SdbCloseDatabase(pdb);
+
+ return NT_SUCCESS(Status);