windows-nt/Source/XPSP1/NT/net/layer2svc/zeroconf/client/wzcdbapi.c
2020-09-26 16:20:57 +08:00

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);
}