/*++ Copyright (c) 2000 Microsoft Corporation Module Name: tracelib.c Abstract: Private trace libraries and stubs that allows user-mode to reside in NTDLL. Author: 15-Aug-2000 JeePang Revision History: --*/ #include #include #include #include #include "trcapi.h" #include "tracelib.h" /*ONG WmipSetDosError( IN ULONG DosError ) { WmipSetLastError(DosError); return DosError; }*/ ULONG WmipSetNtStatus( IN NTSTATUS Status ) { ULONG ErrorCode = RtlNtStatusToDosError(Status); WmipSetLastError(ErrorCode); return ErrorCode; } PVOID WmipMemReserve( IN SIZE_T Size ) { NTSTATUS Status; PVOID lpAddress = NULL; try { Status = NtAllocateVirtualMemory( NtCurrentProcess(), &lpAddress, 0, &Size, MEM_RESERVE, PAGE_READWRITE); } except (EXCEPTION_EXECUTE_HANDLER) { Status = GetExceptionCode(); } if (NT_SUCCESS(Status)) { return lpAddress; } else { WmipSetNtStatus(Status); return NULL; } } PVOID WmipMemCommit( IN PVOID Buffer, IN SIZE_T Size ) { NTSTATUS Status; try { Status = NtAllocateVirtualMemory( NtCurrentProcess(), &Buffer, 0, &Size, MEM_COMMIT, PAGE_READWRITE); } except (EXCEPTION_EXECUTE_HANDLER) { Status = GetExceptionCode(); } if (NT_SUCCESS(Status)) { return Buffer; } else { WmipSetNtStatus(Status); return NULL; } } ULONG WmipMemFree( IN PVOID Buffer ) { NTSTATUS Status; SIZE_T Size = 0; HANDLE hProcess = NtCurrentProcess(); if (Buffer == NULL) { WmipSetDosError(ERROR_INVALID_PARAMETER); return FALSE; } try { Status = NtFreeVirtualMemory( hProcess, &Buffer, &Size, MEM_RELEASE); } except (EXCEPTION_EXECUTE_HANDLER) { Status = GetExceptionCode(); } if (NT_SUCCESS(Status)) { return TRUE; } else { if (Status == STATUS_INVALID_PAGE_PROTECTION) { if (RtlFlushSecureMemoryCache(Buffer, Size)) { Status = NtFreeVirtualMemory( hProcess, Buffer, &Size, MEM_RELEASE); if (NT_SUCCESS(Status)) { return TRUE; } } } WmipSetNtStatus(Status); return FALSE; } } HANDLE WmipCreateFile( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, DWORD dwCreationDisposition, DWORD dwCreateFlags ) { UNICODE_STRING FileName; RTL_RELATIVE_NAME RelativeName; PVOID FreeBuffer; OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK Iosb; NTSTATUS Status; HANDLE FileHandle = INVALID_HANDLE_VALUE; SECURITY_QUALITY_OF_SERVICE SQos; RtlInitUnicodeString(&FileName, lpFileName); if (!RtlDosPathNameToNtPathName_U( lpFileName, &FileName, NULL, &RelativeName)) { WmipSetDosError(ERROR_PATH_NOT_FOUND); return INVALID_HANDLE_VALUE; } FreeBuffer = FileName.Buffer; if (RelativeName.RelativeName.Length) { FileName = *(PUNICODE_STRING) &RelativeName.RelativeName; } else { RelativeName.ContainingDirectory = NULL; } InitializeObjectAttributes( &ObjectAttributes, &FileName, OBJ_CASE_INSENSITIVE, RelativeName.ContainingDirectory, NULL, ); SQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; SQos.ImpersonationLevel = SecurityImpersonation; SQos.EffectiveOnly = TRUE; SQos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE); ObjectAttributes.SecurityQualityOfService = &SQos; Status = NtCreateFile( &FileHandle, (ACCESS_MASK) dwDesiredAccess | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &ObjectAttributes, &Iosb, NULL, FILE_ATTRIBUTE_NORMAL & (FILE_ATTRIBUTE_VALID_FLAGS & ~FILE_ATTRIBUTE_DIRECTORY), dwShareMode, dwCreationDisposition, dwCreateFlags | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); if (!NT_SUCCESS(Status)) { if (Status == STATUS_OBJECT_NAME_COLLISION) { WmipSetDosError(ERROR_FILE_EXISTS); } else { WmipSetNtStatus(Status); } return INVALID_HANDLE_VALUE; } if (lpFileName != FreeBuffer) { RtlFreeHeap(RtlProcessHeap(), 0, FreeBuffer); } return FileHandle; }