Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

251 lines
6.1 KiB

  1. /*++
  2. Copyright (c) 2000 Microsoft Corporation
  3. Module Name:
  4. tracelib.c
  5. Abstract:
  6. Private trace libraries and stubs that allows user-mode to reside in NTDLL.
  7. Author:
  8. 15-Aug-2000 JeePang
  9. Revision History:
  10. --*/
  11. #include <nt.h>
  12. #include <ntrtl.h>
  13. #include <nturtl.h>
  14. #include <windows.h>
  15. #include "tracelib.h"
  16. PVOID
  17. WmipMemReserve(
  18. IN SIZE_T Size
  19. )
  20. {
  21. NTSTATUS Status;
  22. PVOID lpAddress = NULL;
  23. try {
  24. Status = NtAllocateVirtualMemory(
  25. NtCurrentProcess(),
  26. &lpAddress,
  27. 0,
  28. &Size,
  29. MEM_RESERVE,
  30. PAGE_READWRITE);
  31. }
  32. except (EXCEPTION_EXECUTE_HANDLER) {
  33. Status = GetExceptionCode();
  34. }
  35. if (NT_SUCCESS(Status)) {
  36. return lpAddress;
  37. }
  38. else {
  39. WmipSetDosError(WmipNtStatusToDosError(Status));
  40. return NULL;
  41. }
  42. }
  43. PVOID
  44. WmipMemCommit(
  45. IN PVOID Buffer,
  46. IN SIZE_T Size
  47. )
  48. {
  49. NTSTATUS Status;
  50. try {
  51. Status = NtAllocateVirtualMemory(
  52. NtCurrentProcess(),
  53. &Buffer,
  54. 0,
  55. &Size,
  56. MEM_COMMIT,
  57. PAGE_READWRITE);
  58. }
  59. except (EXCEPTION_EXECUTE_HANDLER) {
  60. Status = GetExceptionCode();
  61. }
  62. if (NT_SUCCESS(Status)) {
  63. return Buffer;
  64. }
  65. else {
  66. WmipSetDosError(WmipNtStatusToDosError(Status));
  67. return NULL;
  68. }
  69. }
  70. ULONG
  71. WmipMemFree(
  72. IN PVOID Buffer
  73. )
  74. {
  75. NTSTATUS Status;
  76. SIZE_T Size = 0;
  77. HANDLE hProcess = NtCurrentProcess();
  78. if (Buffer == NULL) {
  79. WmipSetDosError(ERROR_INVALID_PARAMETER);
  80. return FALSE;
  81. }
  82. try {
  83. Status = NtFreeVirtualMemory( hProcess, &Buffer, &Size, MEM_RELEASE);
  84. }
  85. except (EXCEPTION_EXECUTE_HANDLER) {
  86. Status = GetExceptionCode();
  87. }
  88. if (NT_SUCCESS(Status)) {
  89. return TRUE;
  90. }
  91. else {
  92. if (Status == STATUS_INVALID_PAGE_PROTECTION) {
  93. if (RtlFlushSecureMemoryCache(Buffer, Size)) {
  94. Status = NtFreeVirtualMemory(
  95. hProcess, Buffer, &Size, MEM_RELEASE);
  96. if (NT_SUCCESS(Status)) {
  97. return TRUE;
  98. }
  99. }
  100. }
  101. WmipSetDosError(WmipNtStatusToDosError(Status));
  102. return FALSE;
  103. }
  104. }
  105. HANDLE
  106. WmipCreateFile(
  107. LPCWSTR lpFileName,
  108. DWORD dwDesiredAccess,
  109. DWORD dwShareMode,
  110. DWORD dwCreationDisposition,
  111. DWORD dwCreateFlags
  112. )
  113. {
  114. UNICODE_STRING FileName;
  115. RTL_RELATIVE_NAME RelativeName;
  116. PVOID FreeBuffer = NULL;
  117. OBJECT_ATTRIBUTES ObjectAttributes;
  118. IO_STATUS_BLOCK Iosb;
  119. NTSTATUS Status;
  120. HANDLE FileHandle = INVALID_HANDLE_VALUE;
  121. SECURITY_QUALITY_OF_SERVICE SQos;
  122. RtlInitUnicodeString(&FileName, lpFileName);
  123. if (!RtlDosPathNameToNtPathName_U(
  124. lpFileName,
  125. &FileName,
  126. NULL,
  127. &RelativeName)) {
  128. WmipSetDosError(ERROR_PATH_NOT_FOUND);
  129. return INVALID_HANDLE_VALUE;
  130. }
  131. FreeBuffer = FileName.Buffer;
  132. if (RelativeName.RelativeName.Length) {
  133. FileName = *(PUNICODE_STRING) &RelativeName.RelativeName;
  134. }
  135. else {
  136. RelativeName.ContainingDirectory = NULL;
  137. }
  138. InitializeObjectAttributes(
  139. &ObjectAttributes,
  140. &FileName,
  141. OBJ_CASE_INSENSITIVE,
  142. RelativeName.ContainingDirectory,
  143. NULL,
  144. );
  145. SQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
  146. SQos.ImpersonationLevel = SecurityImpersonation;
  147. SQos.EffectiveOnly = TRUE;
  148. SQos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
  149. ObjectAttributes.SecurityQualityOfService = &SQos;
  150. Status = NtCreateFile(
  151. &FileHandle,
  152. (ACCESS_MASK) dwDesiredAccess
  153. | SYNCHRONIZE | FILE_READ_ATTRIBUTES,
  154. &ObjectAttributes,
  155. &Iosb,
  156. NULL,
  157. FILE_ATTRIBUTE_NORMAL
  158. & (FILE_ATTRIBUTE_VALID_FLAGS & ~FILE_ATTRIBUTE_DIRECTORY),
  159. dwShareMode,
  160. dwCreationDisposition,
  161. dwCreateFlags | FILE_SYNCHRONOUS_IO_NONALERT,
  162. NULL,
  163. 0);
  164. if (!NT_SUCCESS(Status)) {
  165. if (Status == STATUS_OBJECT_NAME_COLLISION) {
  166. WmipSetDosError(ERROR_FILE_EXISTS);
  167. }
  168. else {
  169. WmipSetDosError(WmipNtStatusToDosError(Status));
  170. }
  171. FileHandle = INVALID_HANDLE_VALUE;
  172. }
  173. if (lpFileName != FreeBuffer && FreeBuffer != NULL) {
  174. RtlFreeHeap(RtlProcessHeap(), 0, FreeBuffer);
  175. }
  176. return FileHandle;
  177. }
  178. BOOL
  179. WmipSynchReadFile(
  180. HANDLE LogFile,
  181. LPVOID Buffer,
  182. DWORD NumberOfBytesToRead,
  183. LPDWORD NumberOfBytesRead,
  184. LPOVERLAPPED Overlapped
  185. )
  186. /*++
  187. Routine Description:
  188. This routine performs synchronous read on a given file. Since logfile is opened for
  189. asychronous IO, current file position is not available. Thus, for synch read, we need
  190. to use this.
  191. Arguments:
  192. LogFile - handle to file
  193. Buffer - data buffer
  194. NumberOfBytesToRead - number of bytes to read
  195. NumberOfBytesRead - number of bytes read
  196. Overlapped - overlapped structure
  197. Returned Value:
  198. TRUE if succeeded.
  199. --*/
  200. {
  201. BOOL ReadSuccess;
  202. if (Overlapped == NULL || Overlapped->hEvent == NULL || Overlapped->hEvent == INVALID_HANDLE_VALUE) {
  203. return FALSE;
  204. }
  205. if (!ResetEvent(Overlapped->hEvent)) {
  206. return FALSE;
  207. }
  208. ReadSuccess = ReadFile(LogFile,
  209. Buffer,
  210. NumberOfBytesToRead,
  211. NULL,
  212. Overlapped);
  213. if (ReadSuccess || GetLastError() == ERROR_IO_PENDING) {
  214. ReadSuccess = GetOverlappedResult(LogFile, Overlapped, NumberOfBytesRead, TRUE);
  215. if (!ReadSuccess && GetLastError() == ERROR_HANDLE_EOF) {
  216. *NumberOfBytesRead = 0;
  217. SetEvent(Overlapped->hEvent);
  218. }
  219. return ReadSuccess;
  220. }
  221. else {
  222. *NumberOfBytesRead = 0;
  223. SetEvent(Overlapped->hEvent);
  224. return FALSE;
  225. }
  226. }