Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

169 lines
4.2 KiB

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) Microsoft Corporation
//
// SYNOPSIS
//
// Defines functions for loading and storing the database configuration.
//
///////////////////////////////////////////////////////////////////////////////
#include "nt.h"
#include "ntlsa.h"
#include "ntrtl.h"
#include "nturtl.h"
#include "windows.h"
#include "oaidl.h"
#include "dbconfig.h"
static const wchar_t privateKeyName[] = L"NetPolAccountingDbConfig";
HRESULT
WINAPI
IASLoadDatabaseConfig(
PCWSTR server,
BSTR* initString,
BSTR* dataSourceName
)
{
OBJECT_ATTRIBUTES objAttrs;
HANDLE lsa;
NTSTATUS status;
LSA_UNICODE_STRING keyName, systemName, *data;
BSTR bstr1, bstr2;
ULONG winError;
// Validate and initialize the out parameters.
if ((initString == 0) || (dataSourceName == 0))
{
return E_POINTER;
}
*initString = 0;
*dataSourceName = 0;
// Open a connection to the LSA.
RtlInitUnicodeString(&systemName, server);
InitializeObjectAttributes(&objAttrs, 0, 0, 0, 0);
status = LsaOpenPolicy(
&systemName,
&objAttrs,
POLICY_GET_PRIVATE_INFORMATION,
&lsa
);
if (NT_SUCCESS(status))
{
RtlInitUnicodeString(&keyName, privateKeyName);
// Retrieve the private data.
status = LsaRetrievePrivateData(lsa, &keyName, &data);
if (NT_SUCCESS(status) && (data != 0))
{
if (data->Length > 0)
{
// Data is two adjacent null-terminated strings.
bstr1 = SysAllocString(data->Buffer);
bstr2 = SysAllocString(data->Buffer + wcslen(data->Buffer) + 1);
if ((initString == 0) || (dataSourceName == 0))
{
SysFreeString(bstr1);
SysFreeString(bstr2);
status = STATUS_NO_MEMORY;
}
else
{
*initString = bstr1;
*dataSourceName = bstr2;
}
}
LsaFreeMemory(data);
}
else if (status == STATUS_OBJECT_NAME_NOT_FOUND)
{
status = STATUS_SUCCESS;
}
LsaClose(lsa);
}
winError = LsaNtStatusToWinError(status);
return HRESULT_FROM_WIN32(winError);
}
HRESULT
WINAPI
IASStoreDatabaseConfig(
PCWSTR server,
PCWSTR initString,
PCWSTR dataSourceName
)
{
LSA_UNICODE_STRING data, systemName, keyName;
size_t initStringLen, dataSourceNameLen, nbyte;
OBJECT_ATTRIBUTES objAttribs;
NTSTATUS status;
HANDLE lsa;
ULONG winError;
if ((initString != 0) && (dataSourceName != 0))
{
// Allocate memory to hold the data.
initStringLen = wcslen(initString) + 1;
dataSourceNameLen = wcslen(dataSourceName) + 1;
nbyte = (initStringLen + dataSourceNameLen) * sizeof(wchar_t);
data.Buffer = CoTaskMemAlloc(nbyte);
if (data.Buffer == 0)
{
return E_OUTOFMEMORY;
}
// Data is two adjacent null terminated strings.
memcpy(
data.Buffer,
initString,
(initStringLen * sizeof(wchar_t))
);
memcpy(
(data.Buffer + initStringLen),
dataSourceName,
(dataSourceNameLen * sizeof(wchar_t))
);
data.Length = (USHORT)nbyte;
data.MaximumLength = (USHORT)nbyte;
}
else
{
// Config is null, so just zero out the data.
data.Buffer = 0;
data.Length = 0;
data.MaximumLength = 0;
}
// Open a connection to the LSA.
RtlInitUnicodeString(&systemName, server);
InitializeObjectAttributes(&objAttribs, 0, 0, 0, 0);
status = LsaOpenPolicy(
&systemName,
&objAttribs,
POLICY_CREATE_SECRET,
&lsa
);
if (NT_SUCCESS(status))
{
RtlInitUnicodeString(&keyName, privateKeyName);
// Store the config.
status = LsaStorePrivateData(lsa, &keyName, &data);
LsaClose(lsa);
}
CoTaskMemFree(data.Buffer);
winError = LsaNtStatusToWinError(status);
return HRESULT_FROM_WIN32(winError);
}