* dcrt0.cc (signal_shift_subtract): Eliminate ancient backwards compatibility. (check_sanity_and_sync): Ditto. * winsup.h (SIGTOMASK): Ditto. Just use constant in signal calculation. * include/cygwin/version: Remove backwards signal mask compatibility define. * path.cc (symlink_info::check_sysfile): Cosmetic change. * registry.cc (get_registry_hive_path): Remove unneeded variable. * exceptions.cc (handle_sigsuspend): Eliminate thread signal mask and use either main sigmask or current thread sigmask. (set_process_mask): Ditto. (sighold): Ditto. (sigrelse): Ditto. (sigset): Ditto. (set_process_mask_delta): Ditto. (_cygtls::call_signal_handler): Ditto. * fhandler_process.cc (format_process_status): Ditto. * fhandler_termios.cc (fhandler_termios::bg_check): Ditto. * pinfo.h (class pinfo): Ditto. * select.cc (pselect): Ditto. * signal.cc (sigprocmask): Ditto. (abort): Ditto. (sigpause): Ditto. (sigsend): Ditto. (wait_sig): Ditto. * thread.h (pthread::parent_tls): New member. * thread.cc (pthread::pthread): Record parent_tls here. (pthread::thread_init_wrapper): Initialize sigmask from parent thread.
		
			
				
	
	
		
			980 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			980 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* ntdll.h.  Contains ntdll specific stuff not defined elsewhere.
 | 
						|
 | 
						|
   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Red Hat, Inc.
 | 
						|
 | 
						|
   This file is part of Cygwin.
 | 
						|
 | 
						|
   This software is a copyrighted work licensed under the terms of the
 | 
						|
   Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | 
						|
   details. */
 | 
						|
 | 
						|
#ifndef STATUS_INVALID_INFO_CLASS
 | 
						|
/* Some w32api header file defines this so we need to conditionalize this
 | 
						|
   define to avoid warnings. */
 | 
						|
#define STATUS_INVALID_INFO_CLASS     ((NTSTATUS) 0xc0000003)
 | 
						|
#endif
 | 
						|
#define STATUS_INFO_LENGTH_MISMATCH   ((NTSTATUS) 0xc0000004)
 | 
						|
#define STATUS_INVALID_PARAMETER      ((NTSTATUS) 0xc000000d)
 | 
						|
#define STATUS_NO_SUCH_FILE           ((NTSTATUS) 0xc000000f)
 | 
						|
#define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS) 0xc0000010)
 | 
						|
#define STATUS_END_OF_FILE            ((NTSTATUS) 0xc0000011)
 | 
						|
#define STATUS_NO_MEDIA_IN_DEVICE     ((NTSTATUS) 0xc0000013)
 | 
						|
#define STATUS_ACCESS_DENIED          ((NTSTATUS) 0xc0000022)
 | 
						|
#define STATUS_BUFFER_TOO_SMALL       ((NTSTATUS) 0xc0000023)
 | 
						|
#define STATUS_OBJECT_NAME_INVALID    ((NTSTATUS) 0xc0000033)
 | 
						|
#define STATUS_OBJECT_NAME_NOT_FOUND  ((NTSTATUS) 0xc0000034)
 | 
						|
#define STATUS_OBJECT_PATH_NOT_FOUND  ((NTSTATUS) 0xc000003A)
 | 
						|
#define STATUS_SHARING_VIOLATION      ((NTSTATUS) 0xc0000043)
 | 
						|
#define STATUS_EA_TOO_LARGE           ((NTSTATUS) 0xc0000050)
 | 
						|
#define STATUS_NONEXISTENT_EA_ENTRY   ((NTSTATUS) 0xc0000051)
 | 
						|
#define STATUS_NO_EAS_ON_FILE         ((NTSTATUS) 0xc0000052)
 | 
						|
#define STATUS_DELETE_PENDING         ((NTSTATUS) 0xc0000056)
 | 
						|
#define STATUS_DISK_FULL              ((NTSTATUS) 0xc000007f)
 | 
						|
#define STATUS_WORKING_SET_QUOTA      ((NTSTATUS) 0xc00000a1)
 | 
						|
#define STATUS_NOT_SUPPORTED          ((NTSTATUS) 0xc00000bb)
 | 
						|
#define STATUS_DIRECTORY_NOT_EMPTY    ((NTSTATUS) 0xc0000101)
 | 
						|
#define STATUS_NOT_ALL_ASSIGNED       ((NTSTATUS) 0x00000106)
 | 
						|
#define STATUS_INVALID_LEVEL          ((NTSTATUS) 0xc0000148)
 | 
						|
#define STATUS_BUFFER_OVERFLOW        ((NTSTATUS) 0x80000005)
 | 
						|
#define STATUS_NO_MORE_FILES          ((NTSTATUS) 0x80000006)
 | 
						|
#define PDI_MODULES 0x01
 | 
						|
#define PDI_HEAPS 0x04
 | 
						|
#define LDRP_IMAGE_DLL 0x00000004
 | 
						|
#define WSLE_PAGE_READONLY 0x001
 | 
						|
#define WSLE_PAGE_EXECUTE 0x002
 | 
						|
#define WSLE_PAGE_EXECUTE_READ 0x003
 | 
						|
#define WSLE_PAGE_READWRITE 0x004
 | 
						|
#define WSLE_PAGE_WRITECOPY 0x005
 | 
						|
#define WSLE_PAGE_EXECUTE_READWRITE 0x006
 | 
						|
#define WSLE_PAGE_EXECUTE_WRITECOPY 0x007
 | 
						|
#define WSLE_PAGE_SHARE_COUNT_MASK 0x0E0
 | 
						|
#define WSLE_PAGE_SHAREABLE 0x100
 | 
						|
 | 
						|
#define FILE_SUPERSEDED     0
 | 
						|
#define FILE_OPENED         1
 | 
						|
#define FILE_CREATED        2
 | 
						|
#define FILE_OVERWRITTEN    3
 | 
						|
#define FILE_EXISTS         4
 | 
						|
#define FILE_DOES_NOT_EXIST 5
 | 
						|
 | 
						|
#define FILE_WRITE_TO_END_OF_FILE      (-1LL)
 | 
						|
#define FILE_USE_FILE_POINTER_POSITION (-2LL)
 | 
						|
 | 
						|
/* Device Characteristics. */
 | 
						|
#define FILE_REMOVABLE_MEDIA           0x00000001
 | 
						|
#define FILE_READ_ONLY_DEVICE          0x00000002
 | 
						|
#define FILE_FLOPPY_DISKETTE           0x00000004
 | 
						|
#define FILE_WRITE_ONCE_MEDIA          0x00000008
 | 
						|
#define FILE_REMOTE_DEVICE             0x00000010
 | 
						|
#define FILE_DEVICE_IS_MOUNTED         0x00000020
 | 
						|
#define FILE_VIRTUAL_VOLUME            0x00000040
 | 
						|
#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
 | 
						|
#define FILE_DEVICE_SECURE_OPEN        0x00000100
 | 
						|
 | 
						|
typedef enum _FILE_INFORMATION_CLASS
 | 
						|
{
 | 
						|
  FileDirectoryInformation = 1,
 | 
						|
  FileFullDirectoryInformation, // 2
 | 
						|
  FileBothDirectoryInformation, // 3
 | 
						|
  FileBasicInformation, // 4 wdm
 | 
						|
  FileStandardInformation, // 5 wdm
 | 
						|
  FileInternalInformation, // 6
 | 
						|
  FileEaInformation, // 7
 | 
						|
  FileAccessInformation, // 8
 | 
						|
  FileNameInformation, // 9
 | 
						|
  FileRenameInformation, // 10
 | 
						|
  FileLinkInformation, // 11
 | 
						|
  FileNamesInformation, // 12
 | 
						|
  FileDispositionInformation, // 13
 | 
						|
  FilePositionInformation, // 14 wdm
 | 
						|
  FileFullEaInformation, // 15
 | 
						|
  FileModeInformation, // 16
 | 
						|
  FileAlignmentInformation, // 17
 | 
						|
  FileAllInformation, // 18
 | 
						|
  FileAllocationInformation, // 19
 | 
						|
  FileEndOfFileInformation, // 20 wdm
 | 
						|
  FileAlternateNameInformation, // 21
 | 
						|
  FileStreamInformation, // 22
 | 
						|
  FilePipeInformation, // 23
 | 
						|
  FilePipeLocalInformation, // 24
 | 
						|
  FilePipeRemoteInformation, // 25
 | 
						|
  FileMailslotQueryInformation, // 26
 | 
						|
  FileMailslotSetInformation, // 27
 | 
						|
  FileCompressionInformation, // 28
 | 
						|
  FileObjectIdInformation, // 29
 | 
						|
  FileCompletionInformation, // 30
 | 
						|
  FileMoveClusterInformation, // 31
 | 
						|
  FileQuotaInformation, // 32
 | 
						|
  FileReparsePointInformation, // 33
 | 
						|
  FileNetworkOpenInformation, // 34
 | 
						|
  FileAttributeTagInformation, // 35
 | 
						|
  FileTrackingInformation, // 36
 | 
						|
  FileIdBothDirectoryInformation, // 37
 | 
						|
  FileIdFullDirectoryInformation, // 38
 | 
						|
  FileValidDataLengthInformation, // 39
 | 
						|
  FileShortNameInformation, // 40
 | 
						|
  FileMaximumInformation
 | 
						|
} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
 | 
						|
 | 
						|
typedef struct _FILE_NAMES_INFORMATION
 | 
						|
{
 | 
						|
  ULONG  NextEntryOffset;
 | 
						|
  ULONG  FileIndex;
 | 
						|
  ULONG  FileNameLength;
 | 
						|
  WCHAR  FileName[1];
 | 
						|
} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_DIRECTORY_INFORMATION {
 | 
						|
  ULONG  NextEntryOffset;
 | 
						|
  ULONG  FileIndex;
 | 
						|
  LARGE_INTEGER  CreationTime;
 | 
						|
  LARGE_INTEGER  LastAccessTime;
 | 
						|
  LARGE_INTEGER  LastWriteTime;
 | 
						|
  LARGE_INTEGER  ChangeTime;
 | 
						|
  LARGE_INTEGER  EndOfFile;
 | 
						|
  LARGE_INTEGER  AllocationSize;
 | 
						|
  ULONG  FileAttributes;
 | 
						|
  ULONG  FileNameLength;
 | 
						|
  WCHAR  FileName[1];
 | 
						|
} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_BOTH_DIR_INFORMATION
 | 
						|
{
 | 
						|
  ULONG  NextEntryOffset;
 | 
						|
  ULONG  FileIndex;
 | 
						|
  LARGE_INTEGER  CreationTime;
 | 
						|
  LARGE_INTEGER  LastAccessTime;
 | 
						|
  LARGE_INTEGER  LastWriteTime;
 | 
						|
  LARGE_INTEGER  ChangeTime;
 | 
						|
  LARGE_INTEGER  EndOfFile;
 | 
						|
  LARGE_INTEGER  AllocationSize;
 | 
						|
  ULONG  FileAttributes;
 | 
						|
  ULONG  FileNameLength;
 | 
						|
  ULONG  EaSize;
 | 
						|
  CCHAR  ShortNameLength;
 | 
						|
  WCHAR  ShortName[12];
 | 
						|
  WCHAR  FileName[1];
 | 
						|
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_ID_BOTH_DIR_INFORMATION
 | 
						|
{
 | 
						|
  ULONG  NextEntryOffset;
 | 
						|
  ULONG  FileIndex;
 | 
						|
  LARGE_INTEGER  CreationTime;
 | 
						|
  LARGE_INTEGER  LastAccessTime;
 | 
						|
  LARGE_INTEGER  LastWriteTime;
 | 
						|
  LARGE_INTEGER  ChangeTime;
 | 
						|
  LARGE_INTEGER  EndOfFile;
 | 
						|
  LARGE_INTEGER  AllocationSize;
 | 
						|
  ULONG  FileAttributes;
 | 
						|
  ULONG  FileNameLength;
 | 
						|
  ULONG  EaSize;
 | 
						|
  CCHAR  ShortNameLength;
 | 
						|
  WCHAR  ShortName[12];
 | 
						|
  LARGE_INTEGER  FileId;
 | 
						|
  WCHAR  FileName[1];
 | 
						|
} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
 | 
						|
 | 
						|
 | 
						|
#define AT_EXTENDABLE_FILE 0x00002000
 | 
						|
#define AT_ROUND_TO_PAGE 0x40000000
 | 
						|
 | 
						|
#define LOCK_VM_IN_WSL 1
 | 
						|
#define LOCK_VM_IN_RAM 2
 | 
						|
 | 
						|
#define DIRECTORY_QUERY 1
 | 
						|
 | 
						|
typedef ULONG KAFFINITY;
 | 
						|
 | 
						|
typedef enum _SYSTEM_INFORMATION_CLASS
 | 
						|
{
 | 
						|
  SystemBasicInformation = 0,
 | 
						|
  SystemPerformanceInformation = 2,
 | 
						|
  SystemTimeOfDayInformation = 3,
 | 
						|
  SystemProcessesAndThreadsInformation = 5,
 | 
						|
  SystemProcessorTimes = 8,
 | 
						|
  SystemPagefileInformation = 18,
 | 
						|
  /* There are a lot more of these... */
 | 
						|
} SYSTEM_INFORMATION_CLASS;
 | 
						|
 | 
						|
typedef struct _SYSTEM_BASIC_INFORMATION
 | 
						|
{
 | 
						|
  ULONG Unknown;
 | 
						|
  ULONG MaximumIncrement;
 | 
						|
  ULONG PhysicalPageSize;
 | 
						|
  ULONG NumberOfPhysicalPages;
 | 
						|
  ULONG LowestPhysicalPage;
 | 
						|
  ULONG HighestPhysicalPage;
 | 
						|
  ULONG AllocationGranularity;
 | 
						|
  ULONG LowestUserAddress;
 | 
						|
  ULONG HighestUserAddress;
 | 
						|
  ULONG ActiveProcessors;
 | 
						|
  UCHAR NumberProcessors;
 | 
						|
} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
 | 
						|
 | 
						|
typedef struct _SYSTEM_PAGEFILE_INFORMATION
 | 
						|
{
 | 
						|
  ULONG NextEntryOffset;
 | 
						|
  ULONG CurrentSize;
 | 
						|
  ULONG TotalUsed;
 | 
						|
  ULONG PeakUsed;
 | 
						|
  UNICODE_STRING FileName;
 | 
						|
} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
 | 
						|
 | 
						|
typedef struct __attribute__ ((aligned (8))) _SYSTEM_PROCESSOR_TIMES
 | 
						|
{
 | 
						|
  LARGE_INTEGER IdleTime;
 | 
						|
  LARGE_INTEGER KernelTime;
 | 
						|
  LARGE_INTEGER UserTime;
 | 
						|
  LARGE_INTEGER DpcTime;
 | 
						|
  LARGE_INTEGER InterruptTime;
 | 
						|
  ULONG InterruptCount;
 | 
						|
} SYSTEM_PROCESSOR_TIMES, *PSYSTEM_PROCESSOR_TIMES;
 | 
						|
 | 
						|
typedef LONG KPRIORITY;
 | 
						|
typedef struct _VM_COUNTERS
 | 
						|
{
 | 
						|
  ULONG PeakVirtualSize;
 | 
						|
  ULONG VirtualSize;
 | 
						|
  ULONG PageFaultCount;
 | 
						|
  ULONG PeakWorkingSetSize;
 | 
						|
  ULONG WorkingSetSize;
 | 
						|
  ULONG QuotaPeakPagedPoolUsage;
 | 
						|
  ULONG QuotaPagedPoolUsage;
 | 
						|
  ULONG QuotaPeakNonPagedPoolUsage;
 | 
						|
  ULONG QuotaNonPagedPoolUsage;
 | 
						|
  ULONG PagefileUsage;
 | 
						|
  ULONG PeakPagefileUsage;
 | 
						|
} VM_COUNTERS, *PVM_COUNTERS;
 | 
						|
 | 
						|
typedef struct _CLIENT_ID
 | 
						|
{
 | 
						|
  HANDLE UniqueProcess;
 | 
						|
  HANDLE UniqueThread;
 | 
						|
} CLIENT_ID, *PCLIENT_ID;
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  StateInitialized,
 | 
						|
  StateReady,
 | 
						|
  StateRunning,
 | 
						|
  StateStandby,
 | 
						|
  StateTerminated,
 | 
						|
  StateWait,
 | 
						|
  StateTransition,
 | 
						|
  StateUnknown,
 | 
						|
} THREAD_STATE;
 | 
						|
 | 
						|
typedef enum
 | 
						|
{
 | 
						|
  Executive,
 | 
						|
  FreePage,
 | 
						|
  PageIn,
 | 
						|
  PoolAllocation,
 | 
						|
  DelayExecution,
 | 
						|
  Suspended,
 | 
						|
  UserRequest,
 | 
						|
  WrExecutive,
 | 
						|
  WrFreePage,
 | 
						|
  WrPageIn,
 | 
						|
  WrPoolAllocation,
 | 
						|
  WrDelayExecution,
 | 
						|
  WrSuspended,
 | 
						|
  WrUserRequest,
 | 
						|
  WrEventPair,
 | 
						|
  WrQueue,
 | 
						|
  WrLpcReceive,
 | 
						|
  WrLpcReply,
 | 
						|
  WrVirtualMemory,
 | 
						|
  WrPageOut,
 | 
						|
  WrRendezvous,
 | 
						|
  Spare2,
 | 
						|
  Spare3,
 | 
						|
  Spare4,
 | 
						|
  Spare5,
 | 
						|
  Spare6,
 | 
						|
  WrKernel,
 | 
						|
  MaximumWaitReason
 | 
						|
} KWAIT_REASON;
 | 
						|
 | 
						|
typedef struct _SYSTEM_THREADS
 | 
						|
{
 | 
						|
  LARGE_INTEGER KernelTime;
 | 
						|
  LARGE_INTEGER UserTime;
 | 
						|
  LARGE_INTEGER CreateTime;
 | 
						|
  ULONG WaitTime;
 | 
						|
  PVOID StartAddress;
 | 
						|
  CLIENT_ID ClientId;
 | 
						|
  KPRIORITY Priority;
 | 
						|
  KPRIORITY BasePriority;
 | 
						|
  ULONG ContextSwitchCount;
 | 
						|
  THREAD_STATE State;
 | 
						|
  KWAIT_REASON WaitReason;
 | 
						|
  DWORD Reserved;
 | 
						|
} SYSTEM_THREADS, *PSYSTEM_THREADS;
 | 
						|
 | 
						|
typedef struct _SYSTEM_PROCESSES
 | 
						|
{
 | 
						|
  ULONG NextEntryDelta;
 | 
						|
  ULONG ThreadCount;
 | 
						|
  ULONG Reserved1[6];
 | 
						|
  LARGE_INTEGER CreateTime;
 | 
						|
  LARGE_INTEGER UserTime;
 | 
						|
  LARGE_INTEGER KernelTime;
 | 
						|
  UNICODE_STRING ProcessName;
 | 
						|
  KPRIORITY BasePriority;
 | 
						|
  ULONG ProcessId;
 | 
						|
  ULONG InheritedFromProcessId;
 | 
						|
  ULONG HandleCount;
 | 
						|
  ULONG Reserved2[2];
 | 
						|
  VM_COUNTERS VmCounters;
 | 
						|
  IO_COUNTERS IoCounters;
 | 
						|
  SYSTEM_THREADS Threads[1];
 | 
						|
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
 | 
						|
 | 
						|
typedef struct _IO_STATUS_BLOCK
 | 
						|
{
 | 
						|
  NTSTATUS Status;
 | 
						|
  ULONG Information;
 | 
						|
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
 | 
						|
 | 
						|
typedef struct _SYSTEM_PERFORMANCE_INFORMATION
 | 
						|
{
 | 
						|
  LARGE_INTEGER IdleTime;
 | 
						|
  LARGE_INTEGER ReadTransferCount;
 | 
						|
  LARGE_INTEGER WriteTransferCount;
 | 
						|
  LARGE_INTEGER OtherTransferCount;
 | 
						|
  ULONG ReadOperationCount;
 | 
						|
  ULONG WriteOperationCount;
 | 
						|
  ULONG OtherOperationCount;
 | 
						|
  ULONG AvailablePages;
 | 
						|
  ULONG TotalCommittedPages;
 | 
						|
  ULONG TotalCommitLimit;
 | 
						|
  ULONG PeakCommitment;
 | 
						|
  ULONG PageFaults;
 | 
						|
  ULONG WriteCopyFaults;
 | 
						|
  ULONG TransitionFaults;
 | 
						|
  ULONG Reserved1;
 | 
						|
  ULONG DemandZeroFaults;
 | 
						|
  ULONG PagesRead;
 | 
						|
  ULONG PageReadIos;
 | 
						|
  ULONG Reserved2[2];
 | 
						|
  ULONG PagefilePagesWritten;
 | 
						|
  ULONG PagefilePageWriteIos;
 | 
						|
  ULONG MappedFilePagesWritten;
 | 
						|
  ULONG MappedFilePageWriteIos;
 | 
						|
  ULONG PagedPoolUsage;
 | 
						|
  ULONG NonPagedPoolUsage;
 | 
						|
  ULONG PagedPoolAllocs;
 | 
						|
  ULONG PagedPoolFrees;
 | 
						|
  ULONG NonPagedPoolAllocs;
 | 
						|
  ULONG NonPagedPoolFrees;
 | 
						|
  ULONG TotalFreeSystemPtes;
 | 
						|
  ULONG SystemCodePage;
 | 
						|
  ULONG TotalSystemDriverPages;
 | 
						|
  ULONG TotalSystemCodePages;
 | 
						|
  ULONG SmallNonPagedLookasideListAllocateHits;
 | 
						|
  ULONG SmallPagedLookasideListAllocateHits;
 | 
						|
  ULONG Reserved3;
 | 
						|
  ULONG MmSystemCachePage;
 | 
						|
  ULONG PagedPoolPage;
 | 
						|
  ULONG SystemDriverPage;
 | 
						|
  ULONG FastReadNoWait;
 | 
						|
  ULONG FastReadWait;
 | 
						|
  ULONG FastReadResourceMiss;
 | 
						|
  ULONG FastReadNotPossible;
 | 
						|
  ULONG FastMdlReadNoWait;
 | 
						|
  ULONG FastMdlReadWait;
 | 
						|
  ULONG FastMdlReadResourceMiss;
 | 
						|
  ULONG FastMdlReadNotPossible;
 | 
						|
  ULONG MapDataNoWait;
 | 
						|
  ULONG MapDataWait;
 | 
						|
  ULONG MapDataNoWaitMiss;
 | 
						|
  ULONG MapDataWaitMiss;
 | 
						|
  ULONG PinMappedDataCount;
 | 
						|
  ULONG PinReadNoWait;
 | 
						|
  ULONG PinReadWait;
 | 
						|
  ULONG PinReadNoWaitMiss;
 | 
						|
  ULONG PinReadWaitMiss;
 | 
						|
  ULONG CopyReadNoWait;
 | 
						|
  ULONG CopyReadWait;
 | 
						|
  ULONG CopyReadNoWaitMiss;
 | 
						|
  ULONG CopyReadWaitMiss;
 | 
						|
  ULONG MdlReadNoWait;
 | 
						|
  ULONG MdlReadWait;
 | 
						|
  ULONG MdlReadNoWaitMiss;
 | 
						|
  ULONG MdlReadWaitMiss;
 | 
						|
  ULONG ReadAheadIos;
 | 
						|
  ULONG LazyWriteIos;
 | 
						|
  ULONG LazyWritePages;
 | 
						|
  ULONG DataFlushes;
 | 
						|
  ULONG DataPages;
 | 
						|
  ULONG ContextSwitches;
 | 
						|
  ULONG FirstLevelTbFills;
 | 
						|
  ULONG SecondLevelTbFills;
 | 
						|
  ULONG SystemCalls;
 | 
						|
} SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION;
 | 
						|
 | 
						|
typedef struct __attribute__ ((aligned(8))) _SYSTEM_TIME_OF_DAY_INFORMATION
 | 
						|
{
 | 
						|
  LARGE_INTEGER BootTime;
 | 
						|
  LARGE_INTEGER CurrentTime;
 | 
						|
  LARGE_INTEGER TimeZoneBias;
 | 
						|
  ULONG CurrentTimeZoneId;
 | 
						|
} SYSTEM_TIME_OF_DAY_INFORMATION, *PSYSTEM_TIME_OF_DAY_INFORMATION;
 | 
						|
 | 
						|
typedef enum _PROCESSINFOCLASS
 | 
						|
{
 | 
						|
  ProcessBasicInformation = 0,
 | 
						|
  ProcessQuotaLimits = 1,
 | 
						|
  ProcessVmCounters = 3,
 | 
						|
  ProcessTimes =4,
 | 
						|
} PROCESSINFOCLASS;
 | 
						|
 | 
						|
typedef struct _DEBUG_BUFFER
 | 
						|
{
 | 
						|
  HANDLE SectionHandle;
 | 
						|
  PVOID SectionBase;
 | 
						|
  PVOID RemoteSectionBase;
 | 
						|
  ULONG SectionBaseDelta;
 | 
						|
  HANDLE EventPairHandle;
 | 
						|
  ULONG Unknown[2];
 | 
						|
  HANDLE RemoteThreadHandle;
 | 
						|
  ULONG InfoClassMask;
 | 
						|
  ULONG SizeOfInfo;
 | 
						|
  ULONG AllocatedSize;
 | 
						|
  ULONG SectionSize;
 | 
						|
  PVOID ModuleInformation;
 | 
						|
  PVOID BackTraceInformation;
 | 
						|
  PVOID HeapInformation;
 | 
						|
  PVOID LockInformation;
 | 
						|
  PVOID Reserved[9];
 | 
						|
} DEBUG_BUFFER, *PDEBUG_BUFFER;
 | 
						|
 | 
						|
typedef struct _DEBUG_HEAP_INFORMATION
 | 
						|
{
 | 
						|
  ULONG Base;
 | 
						|
  ULONG Flags;
 | 
						|
  USHORT Granularity;
 | 
						|
  USHORT Unknown;
 | 
						|
  ULONG Allocated;
 | 
						|
  ULONG Committed;
 | 
						|
  ULONG TagCount;
 | 
						|
  ULONG BlockCount;
 | 
						|
  ULONG Reserved[7];
 | 
						|
  PVOID Tags;
 | 
						|
  PVOID Blocks;
 | 
						|
} DEBUG_HEAP_INFORMATION, *PDEBUG_HEAP_INFORMATION;
 | 
						|
 | 
						|
typedef struct _DEBUG_MODULE_INFORMATION
 | 
						|
{
 | 
						|
  ULONG Reserved[2];
 | 
						|
  ULONG Base;
 | 
						|
  ULONG Size;
 | 
						|
  ULONG Flags;
 | 
						|
  USHORT Index;
 | 
						|
  USHORT Unknown;
 | 
						|
  USHORT LoadCount;
 | 
						|
  USHORT ModuleNameOffset;
 | 
						|
  CHAR ImageName[256];
 | 
						|
} DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION;
 | 
						|
 | 
						|
typedef struct _KERNEL_USER_TIMES
 | 
						|
{
 | 
						|
  LARGE_INTEGER CreateTime;
 | 
						|
  LARGE_INTEGER ExitTime;
 | 
						|
  LARGE_INTEGER KernelTime;
 | 
						|
  LARGE_INTEGER UserTime;
 | 
						|
} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
 | 
						|
 | 
						|
typedef struct _RTL_USER_PROCESS_PARAMETERS
 | 
						|
{
 | 
						|
  ULONG AllocationSize;
 | 
						|
  ULONG Size;
 | 
						|
  ULONG Flags;
 | 
						|
  ULONG DebugFlags;
 | 
						|
  HANDLE hConsole;
 | 
						|
  ULONG ProcessGroup;
 | 
						|
  HANDLE hStdInput;
 | 
						|
  HANDLE hStdOutput;
 | 
						|
  HANDLE hStdError;
 | 
						|
  UNICODE_STRING CurrentDirectoryName;
 | 
						|
  HANDLE CurrentDirectoryHandle;
 | 
						|
  UNICODE_STRING DllPath;
 | 
						|
  UNICODE_STRING ImagePathName;
 | 
						|
  UNICODE_STRING CommandLine;
 | 
						|
  PWSTR Environment;
 | 
						|
  ULONG dwX;
 | 
						|
  ULONG dwY;
 | 
						|
  ULONG dwXSize;
 | 
						|
  ULONG dwYSize;
 | 
						|
  ULONG dwXCountChars;
 | 
						|
  ULONG dwYCountChars;
 | 
						|
  ULONG dwFillAttribute;
 | 
						|
  ULONG dwFlags;
 | 
						|
  ULONG wShowWindow;
 | 
						|
  UNICODE_STRING WindowTitle;
 | 
						|
  UNICODE_STRING DesktopInfo;
 | 
						|
  UNICODE_STRING ShellInfo;
 | 
						|
  UNICODE_STRING RuntimeInfo;
 | 
						|
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
 | 
						|
 | 
						|
typedef struct _PEB
 | 
						|
{
 | 
						|
  BYTE Reserved1[2];
 | 
						|
  BYTE BeingDebugged;
 | 
						|
  BYTE Reserved2[9];
 | 
						|
  PVOID LoaderData;
 | 
						|
  PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
 | 
						|
  BYTE Reserved3[448];
 | 
						|
  ULONG SessionId;
 | 
						|
} PEB, *PPEB;
 | 
						|
 | 
						|
/* Simplifed definition, just to get the PEB pointer. */
 | 
						|
typedef struct _TEB
 | 
						|
{
 | 
						|
  PVOID dummy[12];
 | 
						|
  PPEB                    Peb;
 | 
						|
  /* A lot more follows... */
 | 
						|
} TEB, *PTEB;
 | 
						|
 | 
						|
typedef struct _PROCESS_BASIC_INFORMATION
 | 
						|
{
 | 
						|
  NTSTATUS ExitStatus;
 | 
						|
  PPEB PebBaseAddress;
 | 
						|
  KAFFINITY AffinityMask;
 | 
						|
  KPRIORITY BasePriority;
 | 
						|
  ULONG UniqueProcessId;
 | 
						|
  ULONG InheritedFromUniqueProcessId;
 | 
						|
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
 | 
						|
 | 
						|
typedef enum _MEMORY_INFORMATION_CLASS
 | 
						|
{
 | 
						|
  MemoryBasicInformation,
 | 
						|
  MemoryWorkingSetList,
 | 
						|
  MemorySectionName,
 | 
						|
  MemoryBasicVlmInformation
 | 
						|
} MEMORY_INFORMATION_CLASS;
 | 
						|
 | 
						|
typedef struct _MEMORY_WORKING_SET_LIST
 | 
						|
{
 | 
						|
  ULONG NumberOfPages;
 | 
						|
  ULONG WorkingSetList[1];
 | 
						|
} MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST;
 | 
						|
 | 
						|
typedef struct _FILE_BASIC_INFORMATION {
 | 
						|
  LARGE_INTEGER CreationTime;
 | 
						|
  LARGE_INTEGER LastAccessTime;
 | 
						|
  LARGE_INTEGER LastWriteTime;
 | 
						|
  LARGE_INTEGER ChangeTime;
 | 
						|
  ULONG FileAttributes;
 | 
						|
} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_STANDARD_INFORMATION {
 | 
						|
  LARGE_INTEGER AllocationSize;
 | 
						|
  LARGE_INTEGER EndOfFile;
 | 
						|
  ULONG NumberOfLinks;
 | 
						|
  BOOLEAN DeletePending;
 | 
						|
  BOOLEAN Directory;
 | 
						|
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_NETWORK_OPEN_INFORMATION {
 | 
						|
  LARGE_INTEGER CreationTime;
 | 
						|
  LARGE_INTEGER LastAccessTime;
 | 
						|
  LARGE_INTEGER LastWriteTime;
 | 
						|
  LARGE_INTEGER ChangeTime;
 | 
						|
  LARGE_INTEGER AllocationSize;
 | 
						|
  LARGE_INTEGER EndOfFile;
 | 
						|
  ULONG FileAttributes;
 | 
						|
} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_INTERNAL_INFORMATION {
 | 
						|
  LARGE_INTEGER FileId;
 | 
						|
} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_EA_INFORMATION {
 | 
						|
  ULONG EaSize;
 | 
						|
} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_ACCESS_INFORMATION {
 | 
						|
  ACCESS_MASK AccessFlags;
 | 
						|
} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_DISPOSITION_INFORMATION {
 | 
						|
  BOOLEAN DeleteFile;
 | 
						|
} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_POSITION_INFORMATION {
 | 
						|
  LARGE_INTEGER CurrentByteOffset;
 | 
						|
} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_END_OF_FILE_INFORMATION {
 | 
						|
  LARGE_INTEGER EndOfFile;
 | 
						|
} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_MODE_INFORMATION {
 | 
						|
  ULONG Mode;
 | 
						|
} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_ALIGNMENT_INFORMATION {
 | 
						|
  ULONG AlignmentRequirement;
 | 
						|
} FILE_ALIGNMENT_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_NAME_INFORMATION {
 | 
						|
  ULONG FileNameLength;
 | 
						|
  WCHAR FileName[1];
 | 
						|
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_LINK_INFORMATION {
 | 
						|
  BOOLEAN ReplaceIfExists;
 | 
						|
  HANDLE RootDirectory;
 | 
						|
  ULONG FileNameLength;
 | 
						|
  WCHAR FileName[1];
 | 
						|
} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_RENAME_INFORMATION {
 | 
						|
  BOOLEAN ReplaceIfExists;
 | 
						|
  HANDLE RootDirectory;
 | 
						|
  ULONG FileNameLength;
 | 
						|
  WCHAR FileName[1];
 | 
						|
} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_ALL_INFORMATION {
 | 
						|
  FILE_BASIC_INFORMATION     BasicInformation;
 | 
						|
  FILE_STANDARD_INFORMATION  StandardInformation;
 | 
						|
  FILE_INTERNAL_INFORMATION  InternalInformation;
 | 
						|
  FILE_EA_INFORMATION        EaInformation;
 | 
						|
  FILE_ACCESS_INFORMATION    AccessInformation;
 | 
						|
  FILE_POSITION_INFORMATION  PositionInformation;
 | 
						|
  FILE_MODE_INFORMATION      ModeInformation;
 | 
						|
  FILE_ALIGNMENT_INFORMATION AlignmentInformation;
 | 
						|
  FILE_NAME_INFORMATION      NameInformation;
 | 
						|
} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_PIPE_LOCAL_INFORMATION
 | 
						|
{
 | 
						|
  ULONG NamedPipeType;
 | 
						|
  ULONG NamedPipeConfiguration;
 | 
						|
  ULONG MaximumInstances;
 | 
						|
  ULONG CurrentInstances;
 | 
						|
  ULONG InboundQuota;
 | 
						|
  ULONG ReadDataAvailable;
 | 
						|
  ULONG OutboundQuota;
 | 
						|
  ULONG WriteQuotaAvailable;
 | 
						|
  ULONG NamedPipeState;
 | 
						|
  ULONG NamedPipeEnd;
 | 
						|
} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_COMPRESSION_INFORMATION
 | 
						|
{
 | 
						|
  LARGE_INTEGER CompressedFileSize;
 | 
						|
  USHORT CompressionFormat;
 | 
						|
  UCHAR	CompressionUnitShift;
 | 
						|
  UCHAR ChunkShift;
 | 
						|
  UCHAR ClusterShift;
 | 
						|
  UCHAR Reserved[3];
 | 
						|
} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_FS_DEVICE_INFORMATION
 | 
						|
{
 | 
						|
  ULONG DeviceType;
 | 
						|
  ULONG Characteristics;
 | 
						|
} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_FS_ATTRIBUTE_INFORMATION
 | 
						|
{
 | 
						|
  ULONG FileSystemAttributes;
 | 
						|
  ULONG MaximumComponentNameLength;
 | 
						|
  ULONG FileSystemNameLength;
 | 
						|
  WCHAR FileSystemName[1];
 | 
						|
} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_FS_VOLUME_INFORMATION
 | 
						|
{
 | 
						|
  LARGE_INTEGER VolumeCreationTime;
 | 
						|
  ULONG VolumeSerialNumber;
 | 
						|
  ULONG VolumeLabelLength;
 | 
						|
  BOOLEAN SupportsObjects;
 | 
						|
  WCHAR VolumeLabel[1];
 | 
						|
} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_FS_SIZE_INFORMATION
 | 
						|
{
 | 
						|
  LARGE_INTEGER TotalAllocationUnits;
 | 
						|
  LARGE_INTEGER AvailableAllocationUnits;
 | 
						|
  ULONG SectorsPerAllocationUnit;
 | 
						|
  ULONG BytesPerSector;
 | 
						|
} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_FS_FULL_SIZE_INFORMATION
 | 
						|
{
 | 
						|
  LARGE_INTEGER TotalAllocationUnits;
 | 
						|
  LARGE_INTEGER CallerAvailableAllocationUnits;
 | 
						|
  LARGE_INTEGER ActualAvailableAllocationUnits;
 | 
						|
  ULONG SectorsPerAllocationUnit;
 | 
						|
  ULONG BytesPerSector;
 | 
						|
} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_FS_OBJECTID_INFORMATION {
 | 
						|
    UCHAR ObjectId[16];
 | 
						|
    UCHAR ExtendedInfo[48];
 | 
						|
} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
 | 
						|
 | 
						|
typedef enum _FSINFOCLASS {
 | 
						|
  FileFsVolumeInformation = 1,
 | 
						|
  FileFsLabelInformation,
 | 
						|
  FileFsSizeInformation,
 | 
						|
  FileFsDeviceInformation,
 | 
						|
  FileFsAttributeInformation,
 | 
						|
  FileFsControlInformation,
 | 
						|
  FileFsFullSizeInformation,
 | 
						|
  FileFsObjectIdInformation,
 | 
						|
  FileFsDriverPathInformation,
 | 
						|
  FileFsMaximumInformation
 | 
						|
} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
 | 
						|
 | 
						|
typedef enum _OBJECT_INFORMATION_CLASS
 | 
						|
{
 | 
						|
  ObjectBasicInformation = 0,
 | 
						|
  ObjectNameInformation = 1,
 | 
						|
  ObjectHandleInformation = 4
 | 
						|
   // and many more
 | 
						|
} OBJECT_INFORMATION_CLASS;
 | 
						|
 | 
						|
typedef struct _OBJECT_NAME_INFORMATION
 | 
						|
{
 | 
						|
  UNICODE_STRING Name;
 | 
						|
} OBJECT_NAME_INFORMATION;
 | 
						|
 | 
						|
typedef struct _DIRECTORY_BASIC_INFORMATION
 | 
						|
{
 | 
						|
  UNICODE_STRING ObjectName;
 | 
						|
  UNICODE_STRING ObjectTypeName;
 | 
						|
} DIRECTORY_BASIC_INFORMATION, *PDIRECTORY_BASIC_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_GET_EA_INFORMATION
 | 
						|
{
 | 
						|
  ULONG   NextEntryOffset;
 | 
						|
  UCHAR   EaNameLength;
 | 
						|
  CHAR    EaName[1];
 | 
						|
} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
 | 
						|
 | 
						|
 | 
						|
typedef struct _FILE_FULL_EA_INFORMATION
 | 
						|
{
 | 
						|
  ULONG NextEntryOffset;
 | 
						|
  UCHAR Flags;
 | 
						|
  UCHAR EaNameLength;
 | 
						|
  USHORT EaValueLength;
 | 
						|
  CHAR EaName[1];
 | 
						|
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
 | 
						|
 | 
						|
typedef struct _FILE_MAILSLOT_SET_INFORMATION
 | 
						|
{
 | 
						|
  LARGE_INTEGER ReadTimeout;
 | 
						|
} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
 | 
						|
 | 
						|
typedef VOID NTAPI (*PIO_APC_ROUTINE)(PVOID, PIO_STATUS_BLOCK, ULONG);
 | 
						|
 | 
						|
/* Function declarations for ntdll.dll.  These don't appear in any
 | 
						|
   standard Win32 header.  */
 | 
						|
extern "C"
 | 
						|
{
 | 
						|
  NTSTATUS NTAPI NtAdjustPrivilegesToken (HANDLE, BOOLEAN, PTOKEN_PRIVILEGES,
 | 
						|
					  ULONG, PTOKEN_PRIVILEGES, PULONG);
 | 
						|
  NTSTATUS NTAPI NtClose (HANDLE);
 | 
						|
  NTSTATUS NTAPI NtCreateFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
 | 
						|
			     PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG,
 | 
						|
			     ULONG, ULONG, PVOID, ULONG);
 | 
						|
  NTSTATUS NTAPI NtCreateMailslotFile(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
 | 
						|
				      PIO_STATUS_BLOCK, ULONG, ULONG, ULONG,
 | 
						|
				      PLARGE_INTEGER);
 | 
						|
  NTSTATUS NTAPI NtCreateSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
 | 
						|
				  PLARGE_INTEGER, ULONG, ULONG, HANDLE);
 | 
						|
  NTSTATUS NTAPI NtCreateToken (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
 | 
						|
				TOKEN_TYPE, PLUID, PLARGE_INTEGER, PTOKEN_USER,
 | 
						|
				PTOKEN_GROUPS, PTOKEN_PRIVILEGES, PTOKEN_OWNER,
 | 
						|
				PTOKEN_PRIMARY_GROUP, PTOKEN_DEFAULT_DACL,
 | 
						|
				PTOKEN_SOURCE);
 | 
						|
  NTSTATUS NTAPI NtFsControlFile (HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID,
 | 
						|
				  PIO_STATUS_BLOCK, ULONG, PVOID, ULONG,
 | 
						|
				  PVOID, ULONG);
 | 
						|
  NTSTATUS NTAPI NtLockVirtualMemory (HANDLE, PVOID *, ULONG *, ULONG);
 | 
						|
  NTSTATUS NTAPI NtMapViewOfSection (HANDLE, HANDLE, PVOID *, ULONG, ULONG,
 | 
						|
				     PLARGE_INTEGER, PULONG, SECTION_INHERIT,
 | 
						|
				     ULONG, ULONG);
 | 
						|
  NTSTATUS NTAPI NtNotifyChangeDirectoryFile (HANDLE, HANDLE, PIO_APC_ROUTINE,
 | 
						|
					      PVOID, PIO_STATUS_BLOCK,
 | 
						|
					      PFILE_NOTIFY_INFORMATION, ULONG,
 | 
						|
					      ULONG, BOOLEAN);
 | 
						|
  NTSTATUS NTAPI NtOpenDirectoryObject (PHANDLE, ACCESS_MASK,
 | 
						|
					POBJECT_ATTRIBUTES);
 | 
						|
  NTSTATUS NTAPI NtOpenFile (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
 | 
						|
			     PIO_STATUS_BLOCK, ULONG, ULONG);
 | 
						|
  NTSTATUS NTAPI NtOpenSection (PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
 | 
						|
  /* WARNING!  Don't rely on the timestamp information returned by
 | 
						|
     NtQueryAttributesFile.  Only the DOS file attribute info is reliable. */
 | 
						|
  NTSTATUS NTAPI NtQueryAttributesFile (POBJECT_ATTRIBUTES,
 | 
						|
					PFILE_BASIC_INFORMATION);
 | 
						|
  NTSTATUS NTAPI NtQueryDirectoryFile(HANDLE, HANDLE, PVOID, PVOID,
 | 
						|
				      PIO_STATUS_BLOCK, PVOID, ULONG,
 | 
						|
				      FILE_INFORMATION_CLASS, BOOLEAN,
 | 
						|
				      PUNICODE_STRING, BOOLEAN);
 | 
						|
  NTSTATUS NTAPI NtQueryDirectoryObject (HANDLE, PVOID, ULONG, BOOLEAN,
 | 
						|
					 BOOLEAN, PULONG, PULONG);
 | 
						|
  NTSTATUS NTAPI NtQueryEaFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG,
 | 
						|
				BOOLEAN, PVOID, ULONG, PULONG, BOOLEAN);
 | 
						|
  NTSTATUS NTAPI NtQueryFullAttributesFile (POBJECT_ATTRIBUTES,
 | 
						|
					    PFILE_NETWORK_OPEN_INFORMATION);
 | 
						|
  NTSTATUS NTAPI NtQueryInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID,
 | 
						|
					 ULONG, FILE_INFORMATION_CLASS);
 | 
						|
  NTSTATUS NTAPI NtQueryInformationProcess (HANDLE, PROCESSINFOCLASS,
 | 
						|
					    PVOID, ULONG, PULONG);
 | 
						|
  NTSTATUS NTAPI NtQueryObject (HANDLE, OBJECT_INFORMATION_CLASS, VOID *,
 | 
						|
				ULONG, ULONG *);
 | 
						|
  NTSTATUS NTAPI NtQuerySystemInformation (SYSTEM_INFORMATION_CLASS,
 | 
						|
					   PVOID, ULONG, PULONG);
 | 
						|
  NTSTATUS NTAPI NtQuerySecurityObject (HANDLE, SECURITY_INFORMATION,
 | 
						|
					PSECURITY_DESCRIPTOR, ULONG, PULONG);
 | 
						|
  NTSTATUS NTAPI NtQueryVirtualMemory (HANDLE, PVOID, MEMORY_INFORMATION_CLASS,
 | 
						|
				       PVOID, ULONG, PULONG);
 | 
						|
  NTSTATUS NTAPI NtQueryVolumeInformationFile (HANDLE, IO_STATUS_BLOCK *,
 | 
						|
					       VOID *, ULONG,
 | 
						|
					       FS_INFORMATION_CLASS);
 | 
						|
  NTSTATUS NTAPI NtReadFile (HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID,
 | 
						|
			     PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER,
 | 
						|
			     PULONG);
 | 
						|
  NTSTATUS NTAPI NtSetEaFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG);
 | 
						|
  NTSTATUS NTAPI NtSetInformationFile (HANDLE, PIO_STATUS_BLOCK, PVOID, ULONG,
 | 
						|
				       FILE_INFORMATION_CLASS);
 | 
						|
  NTSTATUS NTAPI NtSetSecurityObject (HANDLE, SECURITY_INFORMATION,
 | 
						|
				      PSECURITY_DESCRIPTOR);
 | 
						|
  NTSTATUS NTAPI NtUnlockVirtualMemory (HANDLE, PVOID *, ULONG *, ULONG);
 | 
						|
  NTSTATUS NTAPI NtUnmapViewOfSection (HANDLE, PVOID);
 | 
						|
  NTSTATUS NTAPI NtWriteFile (HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID,
 | 
						|
			      PIO_STATUS_BLOCK, PVOID, ULONG, PLARGE_INTEGER,
 | 
						|
			      PULONG);
 | 
						|
  NTSTATUS NTAPI RtlAppendUnicodeToString (PUNICODE_STRING, PCWSTR);
 | 
						|
  NTSTATUS NTAPI RtlAppendUnicodeStringToString (PUNICODE_STRING,
 | 
						|
						 PUNICODE_STRING);
 | 
						|
  VOID NTAPI RtlAcquirePebLock ();
 | 
						|
  NTSTATUS NTAPI RtlAnsiStringToUnicodeString (PUNICODE_STRING, PANSI_STRING,
 | 
						|
					       BOOLEAN);
 | 
						|
  LONG NTAPI RtlCompareUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
 | 
						|
				      BOOLEAN);
 | 
						|
  NTSTATUS NTAPI RtlConvertSidToUnicodeString (PUNICODE_STRING, PSID, BOOLEAN);
 | 
						|
  VOID NTAPI RtlCopyUnicodeString (PUNICODE_STRING, PUNICODE_STRING);
 | 
						|
  BOOLEAN NTAPI RtlCreateUnicodeStringFromAsciiz (PUNICODE_STRING, PCSTR);
 | 
						|
  NTSTATUS NTAPI RtlDowncaseUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
 | 
						|
					   BOOLEAN);
 | 
						|
  BOOLEAN NTAPI RtlEqualUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
 | 
						|
				       BOOLEAN);
 | 
						|
  VOID NTAPI RtlFreeAnsiString (PANSI_STRING);
 | 
						|
  VOID NTAPI RtlFreeOemString (POEM_STRING);
 | 
						|
  VOID NTAPI RtlFreeUnicodeString (PUNICODE_STRING);
 | 
						|
  VOID NTAPI RtlInitEmptyUnicodeString (PUNICODE_STRING, PCWSTR, USHORT);
 | 
						|
  VOID NTAPI RtlInitUnicodeString (PUNICODE_STRING, PCWSTR);
 | 
						|
  NTSTATUS NTAPI RtlIntegerToUnicodeString (ULONG, ULONG, PUNICODE_STRING);
 | 
						|
  ULONG NTAPI RtlIsDosDeviceName_U (PCWSTR);
 | 
						|
  ULONG NTAPI RtlNtStatusToDosError (NTSTATUS);
 | 
						|
  NTSTATUS NTAPI RtlOemStringToUnicodeString (PUNICODE_STRING, POEM_STRING,
 | 
						|
					       BOOLEAN);
 | 
						|
  BOOLEAN NTAPI RtlPrefixUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
 | 
						|
					BOOLEAN);
 | 
						|
  VOID NTAPI RtlReleasePebLock ();
 | 
						|
  VOID NTAPI RtlSecondsSince1970ToTime (ULONG, PLARGE_INTEGER);
 | 
						|
  NTSTATUS NTAPI RtlUnicodeStringToAnsiString (PANSI_STRING, PUNICODE_STRING,
 | 
						|
					       BOOLEAN);
 | 
						|
  NTSTATUS NTAPI RtlUnicodeStringToOemString (PANSI_STRING, PUNICODE_STRING,
 | 
						|
					      BOOLEAN);
 | 
						|
  WCHAR NTAPI RtlUpcaseUnicodeChar (WCHAR);
 | 
						|
  NTSTATUS NTAPI RtlUpcaseUnicodeString (PUNICODE_STRING, PUNICODE_STRING,
 | 
						|
					 BOOLEAN);
 | 
						|
 | 
						|
  /* A few Rtl functions are either actually macros, or they just don't
 | 
						|
     exist even though they would be a big help.  We implement them here,
 | 
						|
     partly as inline functions. */
 | 
						|
 | 
						|
  /* RtlInitEmptyUnicodeString is defined as a macro in wdm.h, but that file
 | 
						|
     is missing entirely in w32api. */
 | 
						|
  inline
 | 
						|
  VOID NTAPI RtlInitEmptyUnicodeString(PUNICODE_STRING dest, PCWSTR buf,
 | 
						|
				       USHORT len)
 | 
						|
  {
 | 
						|
    dest->Length = 0;
 | 
						|
    dest->MaximumLength = len;
 | 
						|
    dest->Buffer = (PWSTR) buf;
 | 
						|
  }
 | 
						|
  /* Like RtlInitEmptyUnicodeString, but initialize Length to len, too.
 | 
						|
     This is for instance useful when creating a UNICODE_STRING from an
 | 
						|
     NtQueryInformationFile info buffer, where the length of the filename
 | 
						|
     is known, but you can't rely on the string being 0-terminated.
 | 
						|
     If you know it's 0-terminated, just use RtlInitUnicodeString(). */
 | 
						|
  inline
 | 
						|
  VOID NTAPI RtlInitCountedUnicodeString (PUNICODE_STRING dest, PCWSTR buf,
 | 
						|
					  USHORT len)
 | 
						|
  {
 | 
						|
    dest->Length = dest->MaximumLength = len;
 | 
						|
    dest->Buffer = (PWSTR) buf;
 | 
						|
  }
 | 
						|
  /* Split path into dirname and basename part.  This function does not
 | 
						|
     copy anything!  It just initializes the dirname and basename
 | 
						|
     UNICODE_STRINGs so that their Buffer members point to the right spot
 | 
						|
     into path's Buffer, and the Length (and MaximumLength) members are set
 | 
						|
     to match the dirname part and the basename part.
 | 
						|
     Note that dirname's Length is set so that it also includes the trailing
 | 
						|
     backslash.  If you don't need it, just subtract sizeof(WCHAR) from
 | 
						|
     dirname.Length. */
 | 
						|
  inline
 | 
						|
  VOID NTAPI RtlSplitUnicodePath (PUNICODE_STRING path, PUNICODE_STRING dirname,
 | 
						|
				  PUNICODE_STRING basename)
 | 
						|
  {
 | 
						|
    USHORT len = path->Length / sizeof (WCHAR);
 | 
						|
    while (len > 0 && path->Buffer[--len] != L'\\')
 | 
						|
      ;
 | 
						|
    ++len;
 | 
						|
    if (dirname)
 | 
						|
      RtlInitCountedUnicodeString (dirname, path->Buffer, len * sizeof (WCHAR));
 | 
						|
    if (basename)
 | 
						|
      RtlInitCountedUnicodeString (basename, &path->Buffer[len],
 | 
						|
				   path->Length - len * sizeof (WCHAR));
 | 
						|
  }
 | 
						|
  /* Check if prefix is a prefix of path. */
 | 
						|
  inline
 | 
						|
  BOOLEAN NTAPI RtlEqualUnicodePathPrefix (PUNICODE_STRING path, PCWSTR prefix,
 | 
						|
					   BOOLEAN caseinsensitive)
 | 
						|
  {
 | 
						|
    UNICODE_STRING p, pref;
 | 
						|
 | 
						|
    RtlInitUnicodeString (&pref, prefix);
 | 
						|
    RtlInitCountedUnicodeString (&p, path->Buffer,
 | 
						|
				 pref.Length < path->Length
 | 
						|
				 ? pref.Length : path->Length);
 | 
						|
    return RtlEqualUnicodeString (&p, &pref, caseinsensitive);
 | 
						|
  }
 | 
						|
  /* Check if sufffix is a sufffix of path. */
 | 
						|
  inline
 | 
						|
  BOOL NTAPI RtlEqualUnicodePathSuffix (PUNICODE_STRING path, PCWSTR suffix,
 | 
						|
					BOOLEAN caseinsensitive)
 | 
						|
  {
 | 
						|
    UNICODE_STRING p, suf;
 | 
						|
 | 
						|
    RtlInitUnicodeString (&suf, suffix);
 | 
						|
    if (suf.Length < path->Length)
 | 
						|
      RtlInitCountedUnicodeString (&p, (PWCHAR) ((PBYTE) path->Buffer
 | 
						|
				       + path->Length - suf.Length),
 | 
						|
				   suf.Length);
 | 
						|
    else
 | 
						|
      RtlInitCountedUnicodeString (&p, path->Buffer, path->Length);
 | 
						|
    return RtlEqualUnicodeString (&p, &suf, caseinsensitive);
 | 
						|
  }
 | 
						|
  /* Implemented in strfuncs.cc.  Create a Hex UNICODE_STRING from a given
 | 
						|
     64 bit integer value.  If append is TRUE, append the hex string,
 | 
						|
     otherwise overwrite dest.  Returns either STATUS_SUCCESS, or
 | 
						|
     STATUS_BUFFER_OVERFLOW, if the unicode buffer is too small (hasn't
 | 
						|
     room for 16 WCHARs). */
 | 
						|
  NTSTATUS NTAPI RtlInt64ToHexUnicodeString (ULONGLONG value,
 | 
						|
					     PUNICODE_STRING dest,
 | 
						|
					     BOOLEAN append);
 | 
						|
}
 |