242 lines
4.5 KiB
C
242 lines
4.5 KiB
C
|
/*++
|
|||
|
|
|||
|
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;
|
|||
|
}
|