1 // Copyright © 2015, Peter Atashian
2 // Licensed under the MIT License <LICENSE.md>
3 //! This module defines the 32-Bit Windows Base APIs
4 STRUCT!{struct SECURITY_ATTRIBUTES {
5     nLength: ::DWORD,
6     lpSecurityDescriptor: ::LPVOID,
7     bInheritHandle: ::BOOL,
8 }}
9 pub type PSECURITY_ATTRIBUTES = *mut SECURITY_ATTRIBUTES;
10 pub type LPSECURITY_ATTRIBUTES = *mut SECURITY_ATTRIBUTES;
11 STRUCT!{struct OVERLAPPED {
12     Internal: ::ULONG_PTR,
13     InternalHigh: ::ULONG_PTR,
14     Offset: ::DWORD,
15     OffsetHigh: ::DWORD,
16     hEvent: ::HANDLE,
17 }}
18 UNION!(OVERLAPPED, Offset, Pointer, Pointer_mut, ::PVOID);
19 pub type LPOVERLAPPED = *mut OVERLAPPED;
20 STRUCT!{struct OVERLAPPED_ENTRY {
21     lpCompletionKey: ::ULONG_PTR,
22     lpOverlapped: LPOVERLAPPED,
23     Internal: ::ULONG_PTR,
24     dwNumberOfBytesTransferred: ::DWORD,
25 }}
26 pub type LPOVERLAPPED_ENTRY = *mut OVERLAPPED_ENTRY;
27 STRUCT!{struct SYSTEMTIME {
28     wYear: ::WORD,
29     wMonth: ::WORD,
30     wDayOfWeek: ::WORD,
31     wDay: ::WORD,
32     wHour: ::WORD,
33     wMinute: ::WORD,
34     wSecond: ::WORD,
35     wMilliseconds: ::WORD,
36 }}
37 pub type PSYSTEMTIME = *mut SYSTEMTIME;
38 pub type LPSYSTEMTIME = *mut SYSTEMTIME;
39 STRUCT!{nodebug struct WIN32_FIND_DATAA {
40     dwFileAttributes: ::DWORD,
41     ftCreationTime: ::FILETIME,
42     ftLastAccessTime: ::FILETIME,
43     ftLastWriteTime: ::FILETIME,
44     nFileSizeHigh: ::DWORD,
45     nFileSizeLow: ::DWORD,
46     dwReserved0: ::DWORD,
47     dwReserved1: ::DWORD,
48     cFileName: [::CHAR; ::MAX_PATH],
49     cAlternateFileName: [::CHAR; 14],
50 }}
51 pub type PWIN32_FIND_DATAA = *mut WIN32_FIND_DATAA;
52 pub type LPWIN32_FIND_DATAA = *mut WIN32_FIND_DATAA;
53 STRUCT!{nodebug struct WIN32_FIND_DATAW {
54     dwFileAttributes: ::DWORD,
55     ftCreationTime: ::FILETIME,
56     ftLastAccessTime: ::FILETIME,
57     ftLastWriteTime: ::FILETIME,
58     nFileSizeHigh: ::DWORD,
59     nFileSizeLow: ::DWORD,
60     dwReserved0: ::DWORD,
61     dwReserved1: ::DWORD,
62     cFileName: [::WCHAR; ::MAX_PATH],
63     cAlternateFileName: [::WCHAR; 14],
64 }}
65 pub type PWIN32_FIND_DATAW = *mut WIN32_FIND_DATAW;
66 pub type LPWIN32_FIND_DATAW = *mut WIN32_FIND_DATAW;
67 ENUM!{enum FINDEX_INFO_LEVELS {
68     FindExInfoStandard,
69     FindExInfoBasic,
70     FindExInfoMaxInfoLevel,
71 }}
72 pub const FIND_FIRST_EX_CASE_SENSITIVE: ::DWORD = 0x00000001;
73 pub const FIND_FIRST_EX_LARGE_FETCH: ::DWORD = 0x00000002;
74 ENUM!{enum FINDEX_SEARCH_OPS {
75     FindExSearchNameMatch,
76     FindExSearchLimitToDirectories,
77     FindExSearchLimitToDevices,
78     FindExSearchMaxSearchOp,
79 }}
80 ENUM!{enum GET_FILEEX_INFO_LEVELS {
81     GetFileExInfoStandard,
82     GetFileExMaxInfoLevel,
83 }}
84 ENUM!{enum FILE_INFO_BY_HANDLE_CLASS {
85     FileBasicInfo,
86     FileStandardInfo,
87     FileNameInfo,
88     FileRenameInfo,
89     FileDispositionInfo,
90     FileAllocationInfo,
91     FileEndOfFileInfo,
92     FileStreamInfo,
93     FileCompressionInfo,
94     FileAttributeTagInfo,
95     FileIdBothDirectoryInfo,
96     FileIdBothDirectoryRestartInfo,
97     FileIoPriorityHintInfo,
98     FileRemoteProtocolInfo,
99     FileFullDirectoryInfo,
100     FileFullDirectoryRestartInfo,
101     FileStorageInfo,
102     FileAlignmentInfo,
103     FileIdInfo,
104     FileIdExtdDirectoryInfo,
105     FileIdExtdDirectoryRestartInfo,
106     MaximumFileInfoByHandleClass,
107 }}
108 pub type PFILE_INFO_BY_HANDLE_CLASS = *mut FILE_INFO_BY_HANDLE_CLASS;
109 pub type CRITICAL_SECTION = ::RTL_CRITICAL_SECTION;
110 pub type PCRITICAL_SECTION = ::PRTL_CRITICAL_SECTION;
111 pub type LPCRITICAL_SECTION = ::PRTL_CRITICAL_SECTION;
112 pub type CRITICAL_SECTION_DEBUG = ::RTL_CRITICAL_SECTION_DEBUG;
113 pub type PCRITICAL_SECTION_DEBUG = ::PRTL_CRITICAL_SECTION_DEBUG;
114 pub type LPCRITICAL_SECTION_DEBUG = ::PRTL_CRITICAL_SECTION_DEBUG;
115 pub type LPOVERLAPPED_COMPLETION_ROUTINE = Option<unsafe extern "system" fn(
116     dwErrorCode: ::DWORD, dwNumberOfBytesTransfered: ::DWORD, lpOverlapped: LPOVERLAPPED,
117 )>;
118 pub const LOCKFILE_FAIL_IMMEDIATELY: ::DWORD = 0x00000001;
119 pub const LOCKFILE_EXCLUSIVE_LOCK: ::DWORD = 0x00000002;
120 STRUCT!{struct PROCESS_HEAP_ENTRY_Block {
121     hMem: ::HANDLE,
122     dwReserved: [::DWORD; 3],
123 }}
124 STRUCT!{struct PROCESS_HEAP_ENTRY_Region {
125     dwCommittedSize: ::DWORD,
126     dwUnCommittedSize: ::DWORD,
127     lpFirstBlock: ::LPVOID,
128     lpLastBlock: ::LPVOID,
129 }}
130 STRUCT!{struct PROCESS_HEAP_ENTRY {
131     lpData: ::PVOID,
132     cbData: ::DWORD,
133     cbOverhead: ::BYTE,
134     iRegionIndex: ::BYTE,
135     wFlags: ::WORD,
136     Region: PROCESS_HEAP_ENTRY_Region,
137 }}
138 UNION!(PROCESS_HEAP_ENTRY, Region, Block, Block_mut, PROCESS_HEAP_ENTRY_Block);
139 pub type LPPROCESS_HEAP_ENTRY = *mut PROCESS_HEAP_ENTRY;
140 pub type PPROCESS_HEAP_ENTRY = *mut PROCESS_HEAP_ENTRY;
141 pub const PROCESS_HEAP_REGION: ::WORD = 0x0001;
142 pub const PROCESS_HEAP_UNCOMMITTED_RANGE: ::WORD = 0x0002;
143 pub const PROCESS_HEAP_ENTRY_BUSY: ::WORD = 0x0004;
144 pub const PROCESS_HEAP_SEG_ALLOC: ::WORD = 0x0008;
145 pub const PROCESS_HEAP_ENTRY_MOVEABLE: ::WORD = 0x0010;
146 pub const PROCESS_HEAP_ENTRY_DDESHARE: ::WORD = 0x0020;
147 pub type PTHREAD_START_ROUTINE = Option<unsafe extern "system" fn(
148     lpThreadParameter: ::LPVOID,
149 ) -> ::DWORD>;
150 pub type LPTHREAD_START_ROUTINE = PTHREAD_START_ROUTINE;
151 pub type LPCONTEXT = ::PCONTEXT;
152 STRUCT!{struct REASON_CONTEXT_Detailed {
153     LocalizedReasonModule: ::HMODULE,
154     LocalizedReasonId: ::ULONG,
155     ReasonStringCount: ::ULONG,
156     ReasonStrings: *mut ::LPWSTR,
157 }}
158 STRUCT!{struct REASON_CONTEXT {
159     Version: ::ULONG,
160     Flags: ::DWORD,
161     Reason: REASON_CONTEXT_Detailed,
162 }}
163 UNION!(REASON_CONTEXT, Reason, SimpleReasonString, SimpleReasonString_mut, ::LPWSTR);
164 pub type PREASON_CONTEXT = *mut REASON_CONTEXT;
165 pub const EXCEPTION_DEBUG_EVENT: ::DWORD = 1;
166 pub const CREATE_THREAD_DEBUG_EVENT: ::DWORD = 2;
167 pub const CREATE_PROCESS_DEBUG_EVENT: ::DWORD = 3;
168 pub const EXIT_THREAD_DEBUG_EVENT: ::DWORD = 4;
169 pub const EXIT_PROCESS_DEBUG_EVENT: ::DWORD = 5;
170 pub const LOAD_DLL_DEBUG_EVENT: ::DWORD = 6;
171 pub const UNLOAD_DLL_DEBUG_EVENT: ::DWORD = 7;
172 pub const OUTPUT_DEBUG_STRING_EVENT: ::DWORD = 8;
173 pub const RIP_EVENT: ::DWORD = 9;
174 STRUCT!{struct EXCEPTION_DEBUG_INFO {
175     ExceptionRecord: ::EXCEPTION_RECORD,
176     dwFirstChance: ::DWORD,
177 }}
178 pub type LPEXCEPTION_DEBUG_INFO = *mut EXCEPTION_DEBUG_INFO;
179 STRUCT!{nodebug struct CREATE_THREAD_DEBUG_INFO {
180     hThread: ::HANDLE,
181     lpThreadLocalBase: ::LPVOID,
182     lpStartAddress: LPTHREAD_START_ROUTINE,
183 }}
184 pub type LPCREATE_THREAD_DEBUG_INFO = *mut CREATE_THREAD_DEBUG_INFO;
185 STRUCT!{nodebug struct CREATE_PROCESS_DEBUG_INFO {
186     hFile: ::HANDLE,
187     hProcess: ::HANDLE,
188     hThread: ::HANDLE,
189     lpBaseOfImage: ::LPVOID,
190     dwDebugInfoFileOffset: ::DWORD,
191     nDebugInfoSize: ::DWORD,
192     lpThreadLocalBase: ::LPVOID,
193     lpStartAddress: LPTHREAD_START_ROUTINE,
194     lpImageName: ::LPVOID,
195     fUnicode: ::WORD,
196 }}
197 pub type LPCREATE_PROCESS_DEBUG_INFO = *mut CREATE_PROCESS_DEBUG_INFO;
198 STRUCT!{struct EXIT_THREAD_DEBUG_INFO {
199     dwExitCode: ::DWORD,
200 }}
201 pub type LPEXIT_THREAD_DEBUG_INFO = *mut EXIT_THREAD_DEBUG_INFO;
202 STRUCT!{struct EXIT_PROCESS_DEBUG_INFO {
203     dwExitCode: ::DWORD,
204 }}
205 pub type LPEXIT_PROCESS_DEBUG_INFO = *mut EXIT_PROCESS_DEBUG_INFO;
206 STRUCT!{struct LOAD_DLL_DEBUG_INFO {
207     hFile: ::HANDLE,
208     lpBaseOfDll: ::LPVOID,
209     dwDebugInfoFileOffset: ::DWORD,
210     nDebugInfoSize: ::DWORD,
211     lpImageName: ::LPVOID,
212     fUnicode: ::WORD,
213 }}
214 pub type LPLOAD_DLL_DEBUG_INFO = *mut LOAD_DLL_DEBUG_INFO;
215 STRUCT!{struct UNLOAD_DLL_DEBUG_INFO {
216     lpBaseOfDll: ::LPVOID,
217 }}
218 pub type LPUNLOAD_DLL_DEBUG_INFO = *mut UNLOAD_DLL_DEBUG_INFO;
219 STRUCT!{struct OUTPUT_DEBUG_STRING_INFO {
220     lpDebugStringData: ::LPSTR,
221     fUnicode: ::WORD,
222     nDebugStringLength: ::WORD,
223 }}
224 pub type LPOUTPUT_DEBUG_STRING_INFO = *mut OUTPUT_DEBUG_STRING_INFO;
225 STRUCT!{struct RIP_INFO {
226     dwError: ::DWORD,
227     dwType: ::DWORD,
228 }}
229 pub type LPRIP_INFO = *mut RIP_INFO;
230 #[cfg(target_arch="x86_64")]
231 STRUCT!{nodebug struct DEBUG_EVENT {
232     dwDebugEventCode: ::DWORD,
233     dwProcessId: ::DWORD,
234     dwThreadId: ::DWORD,
235     u: [u8; 160],
236 }}
237 #[cfg(target_arch="x86")]
238 STRUCT!{nodebug struct DEBUG_EVENT {
239     dwDebugEventCode: ::DWORD,
240     dwProcessId: ::DWORD,
241     dwThreadId: ::DWORD,
242     u: [u8; 84],
243 }}
244 UNION!(DEBUG_EVENT, u, Exception, Exception_mut, EXCEPTION_DEBUG_INFO);
245 UNION!(DEBUG_EVENT, u, CreateThread, CreateThread_mut, CREATE_THREAD_DEBUG_INFO);
246 UNION!(DEBUG_EVENT, u, CreateProcessInfo, CreateProcessInfo_mut, CREATE_PROCESS_DEBUG_INFO);
247 UNION!(DEBUG_EVENT, u, ExitThread, ExitThread_mut, EXIT_THREAD_DEBUG_INFO);
248 UNION!(DEBUG_EVENT, u, ExitProcess, ExitProcess_mut, EXIT_PROCESS_DEBUG_INFO);
249 UNION!(DEBUG_EVENT, u, LoadDll, LoadDll_mut, LOAD_DLL_DEBUG_INFO);
250 UNION!(DEBUG_EVENT, u, UnloadDll, UnloadDll_mut, UNLOAD_DLL_DEBUG_INFO);
251 UNION!(DEBUG_EVENT, u, DebugString, DebugString_mut, OUTPUT_DEBUG_STRING_INFO);
252 UNION!(DEBUG_EVENT, u, RipInfo, RipInfo_mut, RIP_INFO);
253 pub type LPDEBUG_EVENT = *mut DEBUG_EVENT;
254