ReactOS  0.4.14-dev-77-gd9e7c48
utils.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS system libraries
4  * FILE: dll/win32/kernel32/client/utils.c
5  * PURPOSE: Utility and Support Functions
6  * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
7  * Pierre Schweitzer (pierre.schweitzer@reactos.org)
8  */
9 
10 /* INCLUDES ******************************************************************/
11 
12 #include <k32.h>
13 #ifdef _M_IX86
14 #include "i386/ketypes.h"
15 #elif defined _M_AMD64
16 #include "amd64/ketypes.h"
17 #endif
18 
19 #define NDEBUG
20 #include <debug.h>
21 
22 /* GLOBALS ********************************************************************/
23 
25 BOOL bIsFileApiAnsi = TRUE; // set the file api to ansi or oem
30 
31 /* FUNCTIONS ******************************************************************/
32 
33 ULONG
34 NTAPI
36 {
38 }
39 
40 ULONG
41 NTAPI
43 {
45 }
46 
47 ULONG
48 NTAPI
50 {
52 }
53 
54 ULONG
55 NTAPI
57 {
59 }
60 
61 HANDLE
62 WINAPI
64 {
67  HANDLE DirHandle, BnoHandle, Token, NewToken;
68 
70 
71  if (NtCurrentTeb()->IsImpersonating)
72  {
75  TRUE,
76  &Token);
78 
79  NewToken = NULL;
82  &NewToken,
83  sizeof(HANDLE));
84  if (!NT_SUCCESS (Status))
85  {
86  NtClose(Token);
88  }
89  }
90  else
91  {
92  Token = NULL;
93  }
94 
96  if (BaseNamedObjectDirectory) goto Quickie;
97 
101  NULL,
102  NULL);
103 
104  Status = NtOpenDirectoryObject(&BnoHandle,
110  if (!NT_SUCCESS(Status))
111  {
112  Status = NtOpenDirectoryObject(&DirHandle,
115 
116  if (NT_SUCCESS(Status))
117  {
121  DirHandle,
122  NULL);
123 
124  Status = NtOpenDirectoryObject(&BnoHandle,
130  NtClose(DirHandle);
131 
132  }
133  }
134 
135  if (NT_SUCCESS(Status)) BaseNamedObjectDirectory = BnoHandle;
136 
137 Quickie:
138 
140 
141  if (Token)
142  {
145  &Token,
146  sizeof(Token));
147 
148  NtClose(Token);
149  }
150 
152 }
153 
154 VOID
155 NTAPI
157  IN PVOID Context,
158  OUT BOOLEAN *StopEnumeration)
159 {
160  /* Make sure we get Entry, Context and valid StopEnumeration pointer */
161  ASSERT(Entry);
162  ASSERT(Context);
163  ASSERT(StopEnumeration);
164 
165  /* If entry is already found - signal to stop */
166  if (BasepExeLdrEntry)
167  {
168  *StopEnumeration = TRUE;
169  return;
170  }
171 
172  /* Otherwise keep enumerating until we find a match */
173  if (Entry->DllBase == Context)
174  {
175  /* It matches, so remember the ldr entry */
177 
178  /* And stop enumeration */
179  *StopEnumeration = TRUE;
180  }
181 }
182 
183 /*
184  * Converts an ANSI or OEM String to the TEB StaticUnicodeString
185  */
187 WINAPI
189 {
190  PUNICODE_STRING StaticString = &(NtCurrentTeb()->StaticUnicodeString);
193 
194  /* Initialize an ANSI String */
196  if (!NT_SUCCESS(Status))
197  {
199  }
200  else
201  {
202  /* Convert it */
204  }
205 
206  if (NT_SUCCESS(Status)) return StaticString;
207 
209  {
211  }
212  else
213  {
215  }
216 
217  return NULL;
218 }
219 
220 /*
221  * Allocates space from the Heap and converts an Unicode String into it
222  */
223 BOOLEAN
224 WINAPI
226  IN LPCSTR String)
227 {
230 
231  /* Initialize an ANSI String */
233  if (!NT_SUCCESS(Status))
234  {
236  }
237  else
238  {
239  /* Convert it */
241  }
242 
243  if (NT_SUCCESS(Status)) return TRUE;
244 
246  {
248  }
249  else
250  {
252  }
253 
254  return FALSE;
255 }
256 
257 /*
258  * Allocates space from the Heap and converts an Ansi String into it
259  */
260  /*NOTE: API IS A HACK */
261 VOID
262 WINAPI
265 {
266  ANSI_STRING AnsiTemp;
267  UNICODE_STRING UnicodeTemp;
268 
269  DPRINT("BasepAnsiStringToHeapUnicodeString\n");
270 
271  /* First create the ANSI_STRING */
272  RtlInitAnsiString(&AnsiTemp, AnsiString);
273 
274  if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&UnicodeTemp,
275  &AnsiTemp,
276  TRUE)))
277  {
278  *UnicodeString = UnicodeTemp.Buffer;
279  }
280  else
281  {
282  *UnicodeString = NULL;
283  }
284 }
285 
287 WINAPI
289  IN DWORD dwMilliseconds)
290 {
291  /* Check if this is an infinite wait, which means no timeout argument */
292  if (dwMilliseconds == INFINITE) return NULL;
293 
294  /* Otherwise, convert the time to NT Format */
295  Timeout->QuadPart = dwMilliseconds * -10000LL;
296  return Timeout;
297 }
298 
299 /*
300  * Converts lpSecurityAttributes + Object Name into ObjectAttributes.
301  */
303 WINAPI
305  IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL,
307 {
311  DPRINT("BaseFormatObjectAttributes. Security: %p, Name: %p\n",
312  SecurityAttributes, ObjectName);
313 
314  /* Get the attributes if present */
315  if (SecurityAttributes)
316  {
317  Attributes = SecurityAttributes->bInheritHandle ? OBJ_INHERIT : 0;
318  SecurityDescriptor = SecurityAttributes->lpSecurityDescriptor;
319  }
320  else
321  {
322  if (!ObjectName) return NULL;
323  Attributes = 0;
325  }
326 
327  if (ObjectName)
328  {
331  }
332  else
333  {
335  }
336 
337  /* Create the Object Attributes */
339  ObjectName,
340  Attributes,
343  DPRINT("Attributes: %lx, RootDirectory: %p, SecurityDescriptor: %p\n",
345  return ObjectAttributes;
346 }
347 
348 /*
349  * Creates a stack for a thread or fiber.
350  * NOTE: Adapted from sdk/lib/rtl/thread.c:RtlpCreateUserStack().
351  */
352 NTSTATUS
353 WINAPI
356  _In_opt_ SIZE_T StackCommit,
357  _In_opt_ SIZE_T StackReserve,
358  _Out_ PINITIAL_TEB InitialTeb)
359 {
361  PIMAGE_NT_HEADERS Headers;
362  ULONG_PTR Stack;
363  BOOLEAN UseGuard;
364  ULONG PageSize, AllocationGranularity, Dummy;
365  SIZE_T MinimumStackCommit, GuardPageSize;
366 
367  DPRINT("BaseCreateStack(hProcess: 0x%p, Max: 0x%lx, Current: 0x%lx)\n",
368  hProcess, StackReserve, StackCommit);
369 
370  /* Read page size */
372  AllocationGranularity = BaseStaticServerData->SysInfo.AllocationGranularity;
373 
374  /* Get the Image Headers */
375  Headers = RtlImageNtHeader(NtCurrentPeb()->ImageBaseAddress);
376  if (!Headers) return STATUS_INVALID_IMAGE_FORMAT;
377 
378  if (StackReserve == 0)
379  StackReserve = Headers->OptionalHeader.SizeOfStackReserve;
380 
381  if (StackCommit == 0)
382  {
383  StackCommit = Headers->OptionalHeader.SizeOfStackCommit;
384  }
385  /* Check if the commit is higher than the reserve */
386  else if (StackCommit >= StackReserve)
387  {
388  /* Grow the reserve beyond the commit, up to 1MB alignment */
389  StackReserve = ROUND_UP(StackCommit, 1024 * 1024);
390  }
391 
392  /* Align everything to Page Size */
393  StackCommit = ROUND_UP(StackCommit, PageSize);
394  StackReserve = ROUND_UP(StackReserve, AllocationGranularity);
395 
396  MinimumStackCommit = NtCurrentPeb()->MinimumStackCommit;
397  if ((MinimumStackCommit != 0) && (StackCommit < MinimumStackCommit))
398  {
399  StackCommit = MinimumStackCommit;
400  }
401 
402  /* Check if the commit is higher than the reserve */
403  if (StackCommit >= StackReserve)
404  {
405  /* Grow the reserve beyond the commit, up to 1MB alignment */
406  StackReserve = ROUND_UP(StackCommit, 1024 * 1024);
407  }
408 
409  /* Align everything to Page Size */
410  StackCommit = ROUND_UP(StackCommit, PageSize);
411  StackReserve = ROUND_UP(StackReserve, AllocationGranularity);
412 
413  /* Reserve memory for the stack */
414  Stack = 0;
416  (PVOID*)&Stack,
417  0,
418  &StackReserve,
419  MEM_RESERVE,
421  if (!NT_SUCCESS(Status))
422  {
423  DPRINT1("Failure to reserve stack: %lx\n", Status);
424  return Status;
425  }
426 
427  /* Now set up some basic Initial TEB Parameters */
428  InitialTeb->AllocatedStackBase = (PVOID)Stack;
429  InitialTeb->StackBase = (PVOID)(Stack + StackReserve);
430  InitialTeb->PreviousStackBase = NULL;
431  InitialTeb->PreviousStackLimit = NULL;
432 
433  /* Update the stack position */
434  Stack += StackReserve - StackCommit;
435 
436  /* Check if we can add a guard page */
437  if (StackReserve >= StackCommit + PageSize)
438  {
439  Stack -= PageSize;
440  StackCommit += PageSize;
441  UseGuard = TRUE;
442  }
443  else
444  {
445  UseGuard = FALSE;
446  }
447 
448  /* Allocate memory for the stack */
450  (PVOID*)&Stack,
451  0,
452  &StackCommit,
453  MEM_COMMIT,
455  if (!NT_SUCCESS(Status))
456  {
457  DPRINT1("Failure to allocate stack\n");
458  GuardPageSize = 0;
459  NtFreeVirtualMemory(hProcess, (PVOID*)&Stack, &GuardPageSize, MEM_RELEASE);
460  return Status;
461  }
462 
463  /* Now set the current Stack Limit */
464  InitialTeb->StackLimit = (PVOID)Stack;
465 
466  /* Create a guard page if needed */
467  if (UseGuard)
468  {
469  GuardPageSize = PageSize;
471  (PVOID*)&Stack,
472  &GuardPageSize,
474  &Dummy);
475  if (!NT_SUCCESS(Status))
476  {
477  DPRINT1("Failure to set guard page\n");
478  return Status;
479  }
480 
481  /* Update the Stack Limit keeping in mind the Guard Page */
482  InitialTeb->StackLimit = (PVOID)((ULONG_PTR)InitialTeb->StackLimit +
483  GuardPageSize);
484  }
485 
486  /* We are done! */
487  return STATUS_SUCCESS;
488 }
489 
490 /*
491  * NOTE: Adapted from sdk/lib/rtl/thread.c:RtlpFreeUserStack().
492  */
493 VOID
494 WINAPI
497  _In_ PINITIAL_TEB InitialTeb)
498 {
499  SIZE_T Dummy = 0;
500 
501  /* Free the Stack */
503  &InitialTeb->AllocatedStackBase,
504  &Dummy,
505  MEM_RELEASE);
506 }
507 
508 /*
509  * Creates the Initial Context for a Thread or Fiber
510  */
511 VOID
512 WINAPI
515  IN PVOID StartAddress,
516  IN PVOID StackAddress,
518 {
519 #ifdef _M_IX86
520  ULONG ContextFlags;
521  DPRINT("BaseInitializeContext: %p\n", Context);
522 
523  /* Setup the Initial Win32 Thread Context */
524  Context->Eax = (ULONG)StartAddress;
525  Context->Ebx = (ULONG)Parameter;
526  Context->Esp = (ULONG)StackAddress;
527  /* The other registers are undefined */
528 
529  /* Setup the Segments */
530  Context->SegFs = KGDT_R3_TEB;
531  Context->SegEs = KGDT_R3_DATA;
532  Context->SegDs = KGDT_R3_DATA;
533  Context->SegCs = KGDT_R3_CODE;
534  Context->SegSs = KGDT_R3_DATA;
535  Context->SegGs = 0;
536 
537  /* Set the Context Flags */
538  ContextFlags = Context->ContextFlags;
539  Context->ContextFlags = CONTEXT_FULL;
540 
541  /* Give it some room for the Parameter */
542  Context->Esp -= sizeof(PVOID);
543 
544  /* Set the EFLAGS */
545  Context->EFlags = 0x3000; /* IOPL 3 */
546 
547  /* What kind of context is being created? */
548  if (ContextType == 1)
549  {
550  /* For Threads */
552  }
553  else if (ContextType == 2)
554  {
555  /* This is a fiber: make space for the return address */
556  Context->Esp -= sizeof(PVOID);
557  *((PVOID*)Context->Esp) = BaseFiberStartup;
558 
559  /* Is FPU state required? */
560  Context->ContextFlags |= ContextFlags;
561  if ((ContextFlags & CONTEXT_FLOATING_POINT) == CONTEXT_FLOATING_POINT)
562  {
563  /* Set an initial state */
564  Context->FloatSave.ControlWord = 0x27F;
565  Context->FloatSave.StatusWord = 0;
566  Context->FloatSave.TagWord = 0xFFFF;
567  Context->FloatSave.ErrorOffset = 0;
568  Context->FloatSave.ErrorSelector = 0;
569  Context->FloatSave.DataOffset = 0;
570  Context->FloatSave.DataSelector = 0;
571  if (SharedUserData->ProcessorFeatures[PF_XMMI_INSTRUCTIONS_AVAILABLE])
572  Context->Dr6 = 0x1F80;
573  }
574  }
575  else
576  {
577  /* For first thread in a Process */
579  }
580 
581 #elif defined(_M_AMD64)
582  DPRINT("BaseInitializeContext: %p\n", Context);
583 
584  /* Setup the Initial Win32 Thread Context */
585  Context->Rax = (ULONG_PTR)StartAddress;
586  Context->Rbx = (ULONG_PTR)Parameter;
587  Context->Rsp = (ULONG_PTR)StackAddress;
588  /* The other registers are undefined */
589 
590  /* Setup the Segments */
591  Context->SegGs = KGDT64_R3_DATA | RPL_MASK;
592  Context->SegEs = KGDT64_R3_DATA | RPL_MASK;
593  Context->SegDs = KGDT64_R3_DATA | RPL_MASK;
594  Context->SegCs = KGDT64_R3_CODE | RPL_MASK;
595  Context->SegSs = KGDT64_R3_DATA | RPL_MASK;
596  Context->SegFs = KGDT64_R3_CMTEB | RPL_MASK;
597 
598  /* Set the EFLAGS */
599  Context->EFlags = 0x3000; /* IOPL 3 */
600 
601  if (ContextType == 1) /* For Threads */
602  {
604  }
605  else if (ContextType == 2) /* For Fibers */
606  {
607  Context->Rip = (ULONG_PTR)BaseFiberStartup;
608  }
609  else /* For first thread in a Process */
610  {
612  }
613 
614  /* Set the Context Flags */
615  Context->ContextFlags = CONTEXT_FULL;
616 
617  /* Give it some room for the Parameter */
618  Context->Rsp -= sizeof(PVOID);
619 #elif defined(_M_ARM)
620  DPRINT("BaseInitializeContext: %p\n", Context);
621 
622  // FIXME: check if this is correct!
623  /* Setup the Initial Win32 Thread Context */
624  Context->R0 = (ULONG_PTR)StartAddress;
625  Context->R1 = (ULONG_PTR)Parameter;
626  Context->Sp = (ULONG_PTR)StackAddress;
627 
628  if (ContextType == 1) /* For Threads */
629  {
631  }
632  else if (ContextType == 2) /* For Fibers */
633  {
634  Context->Pc = (ULONG_PTR)BaseFiberStartup;
635  }
636  else /* For first thread in a Process */
637  {
639  }
640 
641  /* Set the Context Flags */
642  Context->ContextFlags = CONTEXT_FULL;
643 
644  /* Give it some room for the Parameter */
645  Context->Sp -= sizeof(PVOID);
646 #else
647 #warning Unknown architecture
649  DbgBreakPoint();
650 #endif
651 }
652 
653 /*
654  * Checks if the privilege for Real-Time Priority is there
655  * Beware about this function behavior:
656  * - In case Keep is set to FALSE, then the function will only check
657  * whether real time is allowed and won't grant the privilege. In that case
658  * it will return TRUE if allowed, FALSE otherwise. Not a state!
659  * It means you don't have to release privilege when calling with FALSE.
660  */
661 PVOID
662 WINAPI
664 {
666  PVOID State;
668 
670  if (!NT_SUCCESS(Status)) return NULL;
671 
672  if (!Keep)
673  {
675  State = (PVOID)TRUE;
676  }
677 
678  return State;
679 }
680 
681 /*
682  * Maps an image file into a section
683  */
684 NTSTATUS
685 WINAPI
686 BasepMapFile(IN LPCWSTR lpApplicationName,
689 {
690  RTL_RELATIVE_NAME_U RelativeName;
693  HANDLE hFile = NULL;
695 
696  DPRINT("BasepMapFile\n");
697 
698  /* Zero out the Relative Directory */
699  RelativeName.ContainingDirectory = NULL;
700 
701  /* Find the application name */
702  if (!RtlDosPathNameToNtPathName_U(lpApplicationName,
704  NULL,
705  &RelativeName))
706  {
708  }
709 
710  DPRINT("ApplicationName %wZ\n", ApplicationName);
711  DPRINT("RelativeName %wZ\n", &RelativeName.RelativeName);
712 
713  /* Did we get a relative name? */
714  if (RelativeName.RelativeName.Length)
715  {
716  ApplicationName = &RelativeName.RelativeName;
717  }
718 
719  /* Initialize the Object Attributes */
723  RelativeName.ContainingDirectory,
724  NULL);
725 
726  /* Try to open the executable */
730  &IoStatusBlock,
733  if (!NT_SUCCESS(Status))
734  {
735  DPRINT1("Failed to open file\n");
737  return Status;
738  }
739 
740  /* Create a section for this file */
743  NULL,
744  NULL,
745  PAGE_EXECUTE,
746  SEC_IMAGE,
747  hFile);
748  NtClose(hFile);
749 
750  /* Return status */
751  DPRINT("Section: %p for file: %p\n", *hSection, hFile);
752  return Status;
753 }
754 
755 /*
756  * @implemented
757  */
758 BOOLEAN
759 WINAPI
761 {
763  BOOL Result;
764 
766  if (NT_SUCCESS(Status))
767  {
768  Result = TRUE;
769  }
770  else
771  {
773  Result = FALSE;
774  }
775  return Result;
776 }
777 
778 /*
779  * @implemented
780  */
781 BOOL
782 WINAPI
784 {
786  BOOL Result;
787 
789  if (NT_SUCCESS(Status))
790  {
791  Result = TRUE;
792  }
793  else
794  {
796  Result = FALSE;
797  }
798  return Result;
799 }
800 
801 /*
802  * @implemented
803  */
804 BOOL
805 WINAPI
807 {
809  BOOL Result;
810 
811  Status = RtlWow64EnableFsRedirectionEx(OldValue, &OldValue);
812  if (NT_SUCCESS(Status))
813  {
814  Result = TRUE;
815  }
816  else
817  {
819  Result = FALSE;
820  }
821  return Result;
822 }
823 
824 /*
825  * @implemented
826  */
827 VOID
828 WINAPI
830 {
831  /* Set the correct Base Api */
836 
837  /* FIXME: Old, deprecated way */
839 }
840 
841 
842 /*
843  * @implemented
844  */
845 VOID
846 WINAPI
848 {
849  /* Set the correct Base Api */
854 
855  /* FIXME: Old, deprecated way */
857 }
858 
859 /*
860  * @implemented
861  */
862 BOOL
863 WINAPI
865 {
867 }
868 
869 /*
870  * @implemented
871  */
872 VOID
873 WINAPI
876 {
878  FILE_BASIC_INFORMATION FileBasicInfo;
879  FILE_DISPOSITION_INFORMATION FileDispositionInfo;
880 
881  /* If no attributes were given, get them */
882  if (!FileAttributes)
883  {
884  FileBasicInfo.FileAttributes = 0;
886  &IoStatusBlock,
887  &FileBasicInfo,
888  sizeof(FileBasicInfo),
890  FileAttributes = FileBasicInfo.FileAttributes;
891  }
892 
893  /* If file is marked as RO, reset its attributes */
895  {
896  RtlZeroMemory(&FileBasicInfo, sizeof(FileBasicInfo));
897  FileBasicInfo.FileAttributes = FILE_ATTRIBUTE_NORMAL;
899  &IoStatusBlock,
900  &FileBasicInfo,
901  sizeof(FileBasicInfo),
903  }
904 
905  /* Finally, mark the file for deletion */
906  FileDispositionInfo.DeleteFile = TRUE;
908  &IoStatusBlock,
909  &FileDispositionInfo,
910  sizeof(FileDispositionInfo),
912 }
913 
914 /*
915  * @unimplemented
916  */
917 NTSTATUS
918 WINAPI
922  OUT PBOOLEAN InJob,
923  OUT PHANDLE NewToken,
924  OUT PHANDLE JobHandle)
925 {
927 
928  /* Validate that there's a name */
929  if ((ApplicationName) && *(ApplicationName))
930  {
931  /* Validate that the required output parameters are there */
932  if ((InJob) && (NewToken) && (JobHandle))
933  {
934  /* Do the work (one day...) */
935  DPRINT("BasepCheckWinSaferRestrictions is UNIMPLEMENTED\n");
937  }
938  else
939  {
940  /* Act as if SEH hit this */
942  }
943  }
944  else
945  {
946  /* Input is invalid */
948  }
949 
950  /* Return the status */
951  return Status;
952 }
#define KGDT64_R3_CODE
Definition: ketypes.h:76
PVOID WINAPI BasepIsRealtimeAllowed(IN BOOLEAN Keep)
Definition: utils.c:663
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
BOOL WINAPI Wow64RevertWow64FsRedirection(IN PVOID OldValue)
Definition: utils.c:806
NTSTATUS WINAPI BaseCreateStack(_In_ HANDLE hProcess, _In_opt_ SIZE_T StackCommit, _In_opt_ SIZE_T StackReserve, _Out_ PINITIAL_TEB InitialTeb)
Definition: utils.c:354
#define IN
Definition: typedefs.h:38
VOID WINAPI BaseInitializeContext(IN PCONTEXT Context, IN PVOID Parameter, IN PVOID StartAddress, IN PVOID StackAddress, IN ULONG ContextType)
Definition: utils.c:513
PUNICODE_STRING WINAPI Basep8BitStringToStaticUnicodeString(IN LPCSTR String)
Definition: utils.c:188
#define TRUE
Definition: types.h:120
NTSYSAPI DWORD WINAPI RtlUnicodeStringToAnsiSize(const UNICODE_STRING *)
#define LL
Definition: tui.h:85
ULONG(NTAPI * PRTL_COUNT_STRINGA)(IN PANSI_STRING UnicodeString)
Definition: kernel32.h:282
#define ROUND_UP(n, align)
Definition: eventvwr.h:31
BOOL bIsFileApiAnsi
Definition: utils.c:25
WCHAR RootDirectory[MAX_PATH]
Definition: format.c:74
NTSTATUS NTAPI NtCreateSection(OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN PLARGE_INTEGER MaximumSize OPTIONAL, IN ULONG SectionPageProtection OPTIONAL, IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL)
Definition: section.c:3373
struct _Entry Entry
Definition: kefuncs.h:640
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
PBASE_STATIC_SERVER_DATA BaseStaticServerData
Definition: dllmain.c:19
PRTL_CONVERT_STRINGA BasepUnicodeStringTo8BitString
Definition: utils.c:27
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH _In_opt_ PEPROCESS _In_opt_ PETHREAD _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
Definition: wsk.h:182
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
VOID WINAPI BasepAnsiStringToHeapUnicodeString(IN LPCSTR AnsiString, OUT LPWSTR *UnicodeString)
Definition: utils.c:263
NTSYSAPI NTSTATUS WINAPI RtlInitAnsiStringEx(PANSI_STRING, PCSZ)
#define DIRECTORY_CREATE_OBJECT
Definition: nt_native.h:1256
NTSTATUS WINAPI BasepCheckWinSaferRestrictions(IN HANDLE UserToken, IN LPWSTR ApplicationName, IN HANDLE FileHandle, OUT PBOOLEAN InJob, OUT PHANDLE NewToken, OUT PHANDLE JobHandle)
Definition: utils.c:919
#define PAGE_GUARD
Definition: nt_native.h:1310
NTSTATUS NTAPI NtOpenDirectoryObject(OUT PHANDLE DirectoryHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: obdir.c:401
ULONG NTAPI BasepAnsiStringToUnicodeSize(IN PANSI_STRING String)
Definition: utils.c:56
HANDLE ContainingDirectory
Definition: rtltypes.h:1375
NTSTATUS NTAPI NtProtectVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *UnsafeBaseAddress, IN OUT SIZE_T *UnsafeNumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG UnsafeOldAccessProtection)
Definition: virtual.c:2986
LONG NTSTATUS
Definition: precomp.h:26
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID _Out_ PHANDLE Token
NTSTATUS(NTAPI * PRTL_CONVERT_STRING)(IN PUNICODE_STRING UnicodeString, IN PANSI_STRING AnsiString, IN BOOLEAN AllocateMemory)
Definition: kernel32.h:272
#define NtCurrentThread()
NTSYSAPI NTSTATUS NTAPI RtlWow64EnableFsRedirection(IN BOOLEAN Wow64FsEnableRedirection)
Definition: libsupp.c:959
#define KGDT64_R3_CMTEB
Definition: ketypes.h:78
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:70
VOID NTAPI RtlReleasePebLock(VOID)
Definition: libsupp.c:82
static WCHAR String[]
Definition: stringtable.c:55
#define CONTEXT_FULL
Definition: compat.h:270
#define TOKEN_IMPERSONATE
Definition: setypes.h:873
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
Definition: cmfuncs.h:62
_In_ PVOID Parameter
Definition: ldrtypes.h:241
void DbgBreakPoint()
Definition: mach.c:553
#define MEM_COMMIT
Definition: nt_native.h:1313
NTSYSAPI DWORD WINAPI RtlUnicodeStringToOemSize(const UNICODE_STRING *)
PLARGE_INTEGER WINAPI BaseFormatTimeOut(OUT PLARGE_INTEGER Timeout, IN DWORD dwMilliseconds)
Definition: utils.c:288
IMAGE_OPTIONAL_HEADER32 OptionalHeader
Definition: ntddk_ex.h:184
#define FILE_SHARE_READ
Definition: compat.h:125
#define _In_opt_
Definition: no_sal2.h:213
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define OBJ_OPENIF
Definition: winternl.h:229
HANDLE FileHandle
Definition: stats.c:38
#define SECTION_ALL_ACCESS
Definition: nt_native.h:1293
BOOLEAN WINAPI Basep8BitStringToDynamicUnicodeString(OUT PUNICODE_STRING UnicodeString, IN LPCSTR String)
Definition: utils.c:225
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define KGDT64_R3_DATA
Definition: ketypes.h:75
BOOL WINAPI AreFileApisANSI(VOID)
Definition: utils.c:864
PRTL_COUNT_STRINGA Basep8BitStringToUnicodeSize
Definition: utils.c:29
#define FILE_READ_DATA
Definition: nt_native.h:628
#define MEM_RESERVE
Definition: nt_native.h:1314
#define PF_XMMI_INSTRUCTIONS_AVAILABLE
VOID WINAPI SetFileApisToANSI(VOID)
Definition: utils.c:847
#define RPL_MASK
Definition: ketypes.h:69
UNICODE_STRING NamedObjectDirectory
Definition: base.h:115
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
NTSYSAPI VOID NTAPI RtlReleasePrivilege(_In_ PVOID ReturnedState)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
#define _Out_
Definition: no_sal2.h:323
#define PAGE_EXECUTE
Definition: nt_native.h:1306
void DPRINT(...)
Definition: polytest.cpp:61
#define KGDT_R3_DATA
Definition: ketypes.h:78
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:166
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
Definition: query.c:2014
const char * LPCSTR
Definition: xmlstorage.h:183
void * PVOID
Definition: retypes.h:9
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE _In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG FileAttributes
Definition: fltkernel.h:1230
PLDR_DATA_TABLE_ENTRY BasepExeLdrEntry
Definition: proc.c:25
SYSTEM_BASIC_INFORMATION SysInfo
Definition: base.h:122
UNICODE_STRING Restricted
Definition: utils.c:24
#define DIRECTORY_TRAVERSE
Definition: nt_native.h:1255
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
Definition: file.c:3951
ULONG NTAPI BasepUnicodeStringToOemSize(IN PUNICODE_STRING String)
Definition: utils.c:35
HANDLE BaseNamedObjectDirectory
Definition: dllmain.c:24
#define STATUS_INVALID_IMAGE_FORMAT
Definition: ntstatus.h:345
#define DIRECTORY_CREATE_SUBDIRECTORY
Definition: nt_native.h:1257
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define OBJ_INHERIT
Definition: winternl.h:225
#define WINAPI
Definition: msvc.h:8
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOLEAN WINAPI Wow64EnableWow64FsRedirection(IN BOOLEAN Wow64EnableWow64FsRedirection)
Definition: utils.c:760
VOID WINAPI BaseFreeThreadStack(_In_ HANDLE hProcess, _In_ PINITIAL_TEB InitialTeb)
Definition: utils.c:495
#define KGDT_R3_TEB
Definition: ketypes.h:81
#define STATUS_OBJECT_PATH_NOT_FOUND
Definition: udferr_usr.h:151
ULONG NTAPI BasepUnicodeStringToAnsiSize(IN PUNICODE_STRING String)
Definition: utils.c:49
#define SetLastError(x)
Definition: compat.h:409
BOOL Privilege(LPTSTR pszPrivilege, BOOL bEnable)
Definition: user_lib.cpp:531
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3399
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
NTSTATUS WINAPI BasepMapFile(IN LPCWSTR lpApplicationName, OUT PHANDLE hSection, IN PUNICODE_STRING ApplicationName)
Definition: utils.c:686
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define SharedUserData
char * PBOOLEAN
Definition: retypes.h:11
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
static const WCHAR L[]
Definition: oid.c:1250
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:414
#define FILE_EXECUTE
Definition: nt_native.h:642
#define FILE_NON_DIRECTORY_FILE
Definition: constants.h:492
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
Definition: btrfs_drv.h:1780
#define SE_INC_BASE_PRIORITY_PRIVILEGE
Definition: security.c:668
NTSTATUS(NTAPI * PRTL_CONVERT_STRINGA)(IN PANSI_STRING AnsiString, IN PCUNICODE_STRING UnicodeString, IN BOOLEAN AllocateMemory)
Definition: kernel32.h:278
VOID NTAPI BasepLocateExeLdrEntry(IN PLDR_DATA_TABLE_ENTRY Entry, IN PVOID Context, OUT BOOLEAN *StopEnumeration)
Definition: utils.c:156
NTSTATUS NTAPI NtQueryInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass)
#define SYNCHRONIZE
Definition: nt_native.h:61
_In_ HANDLE hFile
Definition: mswsock.h:90
NTSYSAPI NTSTATUS NTAPI RtlOemStringToUnicodeString(PUNICODE_STRING DestinationString, PCOEM_STRING SourceString, BOOLEAN AllocateDestinationString)
POBJECT_ATTRIBUTES WINAPI BaseFormatObjectAttributes(OUT POBJECT_ATTRIBUTES ObjectAttributes, IN PSECURITY_ATTRIBUTES SecurityAttributes OPTIONAL, IN PUNICODE_STRING ObjectName)
Definition: utils.c:304
Status
Definition: gdiplustypes.h:24
#define _In_
Definition: no_sal2.h:204
VOID WINAPI SetFileApisToOEM(VOID)
Definition: utils.c:829
HANDLE WINAPI BaseGetNamedObjectDirectory(VOID)
Definition: utils.c:63
ULONG_PTR SIZE_T
Definition: typedefs.h:78
_Must_inspect_result_ _In_ USHORT _In_ PHIDP_PREPARSED_DATA _Out_writes_to_ LengthAttributes PHIDP_EXTENDED_ATTRIBUTES Attributes
Definition: hidpi.h:348
enum State_ State
Definition: pofuncs.h:54
PVOID PVOID PWCHAR ApplicationName
Definition: env.c:45
NTSTATUS NTAPI NtAllocateVirtualMemory(IN HANDLE ProcessHandle, IN OUT PVOID *UBaseAddress, IN ULONG_PTR ZeroBits, IN OUT PSIZE_T URegionSize, IN ULONG AllocationType, IN ULONG Protect)
Definition: virtual.c:4367
static ULONG Timeout
Definition: ping.c:61
FORCEINLINE struct _TEB * NtCurrentTeb(VOID)
Definition: psfuncs.h:420
ULONG(NTAPI * PRTL_COUNT_STRING)(IN PUNICODE_STRING UnicodeString)
Definition: kernel32.h:276
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:61
NTSYSAPI DWORD WINAPI RtlAnsiStringToUnicodeSize(const STRING *)
PRTL_COUNT_STRING BasepUnicodeStringTo8BitSize
Definition: utils.c:28
#define NtCurrentPeb()
Definition: FLS.c:20
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:228
NTSYSAPI NTSTATUS NTAPI RtlWow64EnableFsRedirectionEx(IN PVOID Wow64FsEnableRedirection, OUT PVOID *OldFsRedirectionLevel)
Definition: libsupp.c:971
#define CONTEXT_FLOATING_POINT
Definition: compat.h:267
ULONG NTAPI BasepOemStringToUnicodeSize(IN PANSI_STRING String)
Definition: utils.c:42
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
PRTL_CONVERT_STRING Basep8BitStringToUnicodeString
Definition: utils.c:26
VOID NTAPI RtlAcquirePebLock(VOID)
Definition: libsupp.c:72
#define DPRINT1
Definition: precomp.h:8
#define RtlImageNtHeader
Definition: compat.h:457
NTSYSAPI NTSTATUS NTAPI RtlAcquirePrivilege(_In_ PULONG Privilege, _In_ ULONG NumPriv, _In_ ULONG Flags, _Out_ PVOID *ReturnedState)
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
NTSTATUS NTAPI NtOpenThreadToken(IN HANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN BOOLEAN OpenAsSelf, OUT PHANDLE TokenHandle)
Definition: token.c:3858
#define MEM_RELEASE
Definition: nt_native.h:1316
#define KGDT_R3_CODE
Definition: ketypes.h:77
#define OUT
Definition: typedefs.h:39
VOID WINAPI BaseProcessStartThunk(VOID)
unsigned int ULONG
Definition: retypes.h:1
#define DIRECTORY_QUERY
Definition: nt_native.h:1254
_Must_inspect_result_ _In_ FLT_CONTEXT_TYPE ContextType
Definition: fltkernel.h:1444
#define UNIMPLEMENTED
Definition: debug.h:114
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define ULONG_PTR
Definition: config.h:101
#define SEC_IMAGE
Definition: mmtypes.h:96
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
UNICODE_STRING RelativeName
Definition: rtltypes.h:1374
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define INFINITE
Definition: serial.h:102
return STATUS_SUCCESS
Definition: btrfs.c:2966
_In_ const BITMAPINFO _In_ UINT _In_opt_ HANDLE hSection
Definition: wingdi.h:3234
base of all file and directory entries
Definition: entries.h:82
IN PUNICODE_STRING StaticString
VOID WINAPI BaseThreadStartupThunk(VOID)
NTSYSAPI NTSTATUS NTAPI NtSetInformationFile(IN HANDLE hFile, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN PVOID FileInformationBuffer, IN ULONG FileInformationBufferLength, IN FILE_INFORMATION_CLASS FileInfoClass)
Definition: iofunc.c:3042
NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToNtPathName_U(_In_opt_z_ PCWSTR DosPathName, _Out_ PUNICODE_STRING NtPathName, _Out_opt_ PCWSTR *NtFileNamePart, _Out_opt_ PRTL_RELATIVE_NAME_U DirectoryInfo)
#define PAGE_READWRITE
Definition: nt_native.h:1304
NTSYSAPI UINT WINAPI RtlOemStringToUnicodeSize(const STRING *)
BOOL WINAPI Wow64DisableWow64FsRedirection(IN PVOID *OldValue)
Definition: utils.c:783
#define ERROR_FILENAME_EXCED_RANGE
Definition: winerror.h:263
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
VOID WINAPI BaseMarkFileForDelete(IN HANDLE FileHandle, IN ULONG FileAttributes)
Definition: utils.c:874
NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UBaseAddress, IN PSIZE_T URegionSize, IN ULONG FreeType)
Definition: virtual.c:5090
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68