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;
}
示例#4
0
文件: coinst.c 项目: OwenSmith/xenhid
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);
}