windows-nt/Source/XPSP1/NT/ds/nw/svcdlls/nwwks/server/util.c

242 lines
4.5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
util.c
Abstract:
This module contains miscellaneous utility routines used by the
NetWare Workstation service.
Author:
Rita Wong (ritaw) 08-Feb-1993
Revision History:
--*/
#include <nw.h>
#include <nwstatus.h>
//
// Debug trace flag for selecting which trace statements to output
//
#if DBG
DWORD WorkstationTrace = 0;
#endif // DBG
// Terminal Server Addition -
DWORD
NwImpersonateClient(
VOID
)
/*++
Routine Description:
This function calls RpcImpersonateClient to impersonate the current caller
of an API.
Arguments:
None.
Return Value:
NO_ERROR or reason for failure.
--*/
{
DWORD status;
if ((status = RpcImpersonateClient(NULL)) != NO_ERROR) {
KdPrint(("NWWORKSTATION: Fail to impersonate client %ld\n", status));
}
return status;
}
// Terminal Server Addition -
DWORD
NwRevertToSelf(
VOID
)
/*++
Routine Description:
This function calls RpcRevertToSelf to undo an impersonation.
Arguments:
None.
Return Value:
NO_ERROR or reason for failure.
--*/
{
DWORD status;
if ((status = RpcRevertToSelf()) != NO_ERROR) {
KdPrint(("NWWORKSTATION: Fail to revert to self %ld\n", status));
ASSERT(FALSE);
}
return status;
}
VOID
NwLogEvent(
DWORD MessageId,
DWORD NumberOfSubStrings,
LPWSTR *SubStrings,
DWORD ErrorCode
)
{
HANDLE LogHandle;
LogHandle = RegisterEventSourceW (
NULL,
NW_WORKSTATION_SERVICE
);
if (LogHandle == NULL) {
KdPrint(("NWWORKSTATION: RegisterEventSourceW failed %lu\n",
GetLastError()));
return;
}
if (ErrorCode == NO_ERROR) {
//
// No error codes were specified
//
(void) ReportEventW(
LogHandle,
EVENTLOG_ERROR_TYPE,
0, // event category
MessageId,
(PSID) NULL,
(WORD) NumberOfSubStrings,
0,
SubStrings,
(PVOID) NULL
);
}
else {
//
// Log the error code specified as binary data
//
(void) ReportEventW(
LogHandle,
EVENTLOG_ERROR_TYPE,
0, // event category
MessageId,
(PSID) NULL,
(WORD) NumberOfSubStrings,
sizeof(DWORD),
SubStrings,
(PVOID) &ErrorCode
);
}
DeregisterEventSource(LogHandle);
}
//---------------------------------------------------------------------------------//
// NwGetSessionId - This routine assumed that the thread is already executed in //
// the client context. It just get the session ID without impersonating. //
//---------------------------------------------------------------------------------//
NTSTATUS
NwGetSessionId(
OUT PULONG pSessionId
)
/*++
Routine Description:
This function gets the session id of the current thread.
Arguments:
pSessionId - Returns the session id of the current process.
Return Value:
DWORD - NERR_Success or reason for failure.
--*/
{
NTSTATUS ntstatus;
HANDLE CurrentThreadToken;
ULONG SessionId;
ULONG ReturnLength;
ntstatus = NtOpenThreadToken(
NtCurrentThread(),
TOKEN_QUERY,
TRUE, // Use workstation service's security
// context to open thread token
&CurrentThreadToken
);
if (! NT_SUCCESS(ntstatus)) {
KdPrint(("[Wksta] Cannot open the current thread token %08lx\n",
ntstatus));
goto Exit;
}
//
// Get the session id of the current thread
//
ntstatus = NtQueryInformationToken(
CurrentThreadToken,
TokenSessionId,
&SessionId,
sizeof(ULONG),
&ReturnLength
);
if (! NT_SUCCESS(ntstatus)) {
KdPrint(("[Wksta] Cannot query current thread's token %08lx\n",
ntstatus));
NtClose(CurrentThreadToken);
goto Exit;
}
NtClose(CurrentThreadToken);
*pSessionId = SessionId;
Exit:
return ntstatus;
}