/*++ 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 #include // // 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; }