409 lines
8.2 KiB
C
409 lines
8.2 KiB
C
|
|
|
|
#include "precomp.h"
|
|
|
|
const ULONG guFatalExceptions[] =
|
|
{
|
|
STATUS_ACCESS_VIOLATION,
|
|
STATUS_POSSIBLE_DEADLOCK,
|
|
STATUS_INSTRUCTION_MISALIGNMENT,
|
|
STATUS_DATATYPE_MISALIGNMENT,
|
|
STATUS_PRIVILEGED_INSTRUCTION,
|
|
STATUS_ILLEGAL_INSTRUCTION,
|
|
STATUS_BREAKPOINT,
|
|
STATUS_STACK_OVERFLOW
|
|
};
|
|
|
|
|
|
const int FATAL_EXCEPTIONS_ARRAY_SIZE =
|
|
sizeof(guFatalExceptions) / sizeof(guFatalExceptions[0]);
|
|
|
|
|
|
#define BAIL_ON_WIN32_ERROR(dwError) \
|
|
if (dwError) { \
|
|
goto error; \
|
|
}
|
|
|
|
DWORD
|
|
TranslateExceptionCode(
|
|
DWORD dwExceptionCode
|
|
)
|
|
{
|
|
return (dwExceptionCode);
|
|
}
|
|
|
|
|
|
int
|
|
RPC_ENTRY
|
|
I_RpcExceptionFilter(
|
|
unsigned long uExceptionCode
|
|
)
|
|
{
|
|
int i = 0;
|
|
|
|
|
|
for (i = 0; i < FATAL_EXCEPTIONS_ARRAY_SIZE; i ++) {
|
|
|
|
if (uExceptionCode == guFatalExceptions[i]) {
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
}
|
|
|
|
}
|
|
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
}
|
|
|
|
|
|
DWORD
|
|
WZCDestroyClientContextHandle(
|
|
DWORD dwStatus,
|
|
HANDLE hFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
switch (dwStatus) {
|
|
|
|
case RPC_S_SERVER_UNAVAILABLE:
|
|
case RPC_S_CALL_FAILED:
|
|
case RPC_S_CALL_FAILED_DNE:
|
|
case RPC_S_UNKNOWN_IF:
|
|
|
|
RpcTryExcept {
|
|
|
|
RpcSsDestroyClientContext(&hFilter);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
dwError = dwStatus;
|
|
break;
|
|
|
|
}
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
OpenWZCDbLogSession(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PHANDLE phSession
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
if (!phSession) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcOpenWZCDbLogSession(
|
|
pServerName,
|
|
phSession
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
CloseWZCDbLogSession(
|
|
HANDLE hSession
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!hSession) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcCloseWZCDbLogSession(
|
|
&hSession
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
if (dwError) {
|
|
dwError = WZCDestroyClientContextHandle(
|
|
dwError,
|
|
hSession
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
AddWZCDbLogRecord(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PWZC_DB_RECORD pWZCRecord,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
WZC_DB_RECORD_CONTAINER RecordContainer;
|
|
PWZC_DB_RECORD_CONTAINER pRecordContainer = &RecordContainer;
|
|
|
|
|
|
if (dwVersion || pvReserved != NULL) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
if (!pWZCRecord) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
pRecordContainer->dwNumRecords = 1;
|
|
pRecordContainer->pWZCRecords = pWZCRecord;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcAddWZCDbLogRecord(
|
|
pServerName,
|
|
pRecordContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumWZCDbLogRecords(
|
|
HANDLE hSession,
|
|
PWZC_DB_RECORD pTemplateRecord,
|
|
PBOOL pbEnumFromStart,
|
|
DWORD dwPreferredNumEntries,
|
|
PWZC_DB_RECORD * ppWZCRecords,
|
|
LPDWORD pdwNumRecords,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
WZC_DB_RECORD_CONTAINER RecordContainer;
|
|
PWZC_DB_RECORD_CONTAINER pRecordContainer = &RecordContainer;
|
|
WZC_DB_RECORD_CONTAINER TemplateRecordContainer;
|
|
PWZC_DB_RECORD_CONTAINER pTemplateRecordContainer = &TemplateRecordContainer;
|
|
|
|
|
|
if (pvReserved != NULL) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
memset(pRecordContainer, 0, sizeof(WZC_DB_RECORD_CONTAINER));
|
|
|
|
memset(pTemplateRecordContainer, 0, sizeof(WZC_DB_RECORD_CONTAINER));
|
|
|
|
if (!hSession || !pbEnumFromStart) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (!ppWZCRecords || !pdwNumRecords) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTemplateRecord) {
|
|
pTemplateRecordContainer->dwNumRecords = 1;
|
|
pTemplateRecordContainer->pWZCRecords = pTemplateRecord;
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumWZCDbLogRecords(
|
|
hSession,
|
|
pTemplateRecordContainer,
|
|
pbEnumFromStart,
|
|
dwPreferredNumEntries,
|
|
&pRecordContainer
|
|
);
|
|
if (dwError != ERROR_NO_MORE_ITEMS) {
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppWZCRecords = pRecordContainer->pWZCRecords;
|
|
*pdwNumRecords = pRecordContainer->dwNumRecords;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppWZCRecords = NULL;
|
|
*pdwNumRecords = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
FlushWZCDbLog(
|
|
HANDLE hSession
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!hSession) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcFlushWZCDbLog(
|
|
hSession
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
/*
|
|
GetSpecificLogRecord: Wrapper for the RPC call to get a specific record
|
|
|
|
Arguments:
|
|
[in] hSession - Handle to the database session
|
|
[in] pwzcTemplate - Type of record to locate
|
|
[out] ppWZCRecords - List of records retrieved
|
|
pvReserved - Reserved
|
|
|
|
Returns:
|
|
ERROR_SUCCESS on success
|
|
*/
|
|
|
|
DWORD GetSpecificLogRecord(HANDLE hSession,
|
|
PWZC_DB_RECORD pTemplateRecord,
|
|
PWZC_DB_RECORD *ppWZCRecords,
|
|
LPDWORD pdwNumRecords,
|
|
LPVOID pvReserved)
|
|
{
|
|
DWORD dwError = 0;
|
|
WZC_DB_RECORD_CONTAINER RecordContainer;
|
|
PWZC_DB_RECORD_CONTAINER pRecordContainer = &RecordContainer;
|
|
WZC_DB_RECORD_CONTAINER TemplateRecordContainer;
|
|
PWZC_DB_RECORD_CONTAINER pTemplateRecordContainer=&TemplateRecordContainer;
|
|
|
|
if (pvReserved != NULL)
|
|
{
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
memset(pRecordContainer, 0, sizeof(WZC_DB_RECORD_CONTAINER));
|
|
|
|
memset(pTemplateRecordContainer, 0, sizeof(WZC_DB_RECORD_CONTAINER));
|
|
|
|
if (!hSession)
|
|
{
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (!ppWZCRecords || !pdwNumRecords)
|
|
{
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTemplateRecord)
|
|
{
|
|
pTemplateRecordContainer->dwNumRecords = 1;
|
|
pTemplateRecordContainer->pWZCRecords = pTemplateRecord;
|
|
}
|
|
|
|
RpcTryExcept
|
|
{
|
|
dwError = RpcGetWZCDbLogRecord(hSession,
|
|
pTemplateRecordContainer,
|
|
&pRecordContainer);
|
|
if (dwError != ERROR_NO_MORE_ITEMS)
|
|
{
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
}
|
|
RpcExcept(I_RpcExceptionFilter(RpcExceptionCode()))
|
|
{
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppWZCRecords = pRecordContainer->pWZCRecords;
|
|
*pdwNumRecords = pRecordContainer->dwNumRecords;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppWZCRecords = NULL;
|
|
*pdwNumRecords = 0;
|
|
|
|
return (dwError);
|
|
|
|
}
|
|
|