NTSTATUS WINAPI RegisterProvider(BOOLEAN KernelMode) { NTSTATUS status; UNREFERENCED_PARAMETER(KernelMode); status = BCryptRegisterProvider(VIRTRNG_PROVIDER_NAME, CRYPT_OVERWRITE, &VirtRngProvider); if (!NT_SUCCESS(status)) { SetupWriteTextLogError(SetupGetThreadLogToken(), TXTLOG_INSTALLER, TXTLOG_ERROR, ToDosError(status), "Failed to register as a CNG provider."); return status; } status = BCryptAddContextFunctionProvider(CRYPT_LOCAL, NULL, BCRYPT_RNG_INTERFACE, BCRYPT_RNG_ALGORITHM, VIRTRNG_PROVIDER_NAME, CRYPT_PRIORITY_BOTTOM); if (!NT_SUCCESS(status)) { SetupWriteTextLogError(SetupGetThreadLogToken(), TXTLOG_INSTALLER, TXTLOG_ERROR, ToDosError(status), "Failed to add cryptographic function."); } return status; }
NTSTATUS WINAPI UnregisterProvider() { NTSTATUS status; status = BCryptRemoveContextFunctionProvider(CRYPT_LOCAL, NULL, BCRYPT_RNG_INTERFACE, BCRYPT_RNG_ALGORITHM, VIRTRNG_PROVIDER_NAME); if (!NT_SUCCESS(status)) { SetupWriteTextLogError(SetupGetThreadLogToken(), TXTLOG_INSTALLER, TXTLOG_WARNING, ToDosError(status), "Failed to remove cryptographic function."); } status = BCryptUnregisterProvider(VIRTRNG_PROVIDER_NAME); if (!NT_SUCCESS(status)) { SetupWriteTextLogError(SetupGetThreadLogToken(), TXTLOG_INSTALLER, TXTLOG_WARNING, ToDosError(status), "Failed to unregister as a CNG provider."); } return STATUS_SUCCESS; }
static DWORD ToDosError(NTSTATUS status) { DWORD error = NO_ERROR; HMODULE ntdll; RtlNtStatusToDosErrorFunc RtlNtStatusToDosError; ntdll = LoadLibrary(L"Ntdll.dll"); if (ntdll != NULL) { RtlNtStatusToDosError = (RtlNtStatusToDosErrorFunc) GetProcAddress(ntdll, "RtlNtStatusToDosError"); if (RtlNtStatusToDosError != NULL) { error = RtlNtStatusToDosError(status); } else { error = GetLastError(); SetupWriteTextLogError(SetupGetThreadLogToken(), TXTLOG_INSTALLER, TXTLOG_ERROR, error, "RtlNtStatusToDosError function not found."); } } else { error = GetLastError(); SetupWriteTextLogError(SetupGetThreadLogToken(), TXTLOG_INSTALLER, TXTLOG_ERROR, error, "Failed to load ntdll.dll."); } return error; }
static VOID #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024' __Log( IN const CHAR *Format, IN ... ) { TCHAR Buffer[MAXIMUM_BUFFER_SIZE]; va_list Arguments; size_t Length; SP_LOG_TOKEN LogToken; DWORD Category; DWORD Flags; HRESULT Result; va_start(Arguments, Format); Result = StringCchVPrintf(Buffer, MAXIMUM_BUFFER_SIZE, Format, Arguments); va_end(Arguments); if (Result != S_OK && Result != STRSAFE_E_INSUFFICIENT_BUFFER) return; Result = StringCchLength(Buffer, MAXIMUM_BUFFER_SIZE, &Length); if (Result != S_OK) return; LogToken = SetupGetThreadLogToken(); Category = TXTLOG_VENDOR; Flags = TXTLOG_WARNING; SetupWriteTextLog(LogToken, Category, Flags, Buffer); Length = __min(MAXIMUM_BUFFER_SIZE - 1, Length + 2); __analysis_assume(Length < MAXIMUM_BUFFER_SIZE); __analysis_assume(Length >= 2); Buffer[Length] = '\0'; Buffer[Length - 1] = '\n'; Buffer[Length - 2] = '\r'; OutputDebugString(Buffer); }