1------------------------------------------------------------------------------ 2-- -- 3-- GNAT RUN-TIME COMPONENTS -- 4-- -- 5-- S Y S T E M . W I N 3 2 -- 6-- -- 7-- S p e c -- 8-- -- 9-- Copyright (C) 2008-2021, Free Software Foundation, Inc. -- 10-- -- 11-- GNAT is free software; you can redistribute it and/or modify it under -- 12-- terms of the GNU General Public License as published by the Free Soft- -- 13-- ware Foundation; either version 3, or (at your option) any later ver- -- 14-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- 15-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- 16-- or FITNESS FOR A PARTICULAR PURPOSE. -- 17-- -- 18-- As a special exception under Section 7 of GPL version 3, you are granted -- 19-- additional permissions described in the GCC Runtime Library Exception, -- 20-- version 3.1, as published by the Free Software Foundation. -- 21-- -- 22-- You should have received a copy of the GNU General Public License and -- 23-- a copy of the GCC Runtime Library Exception along with this program; -- 24-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- 25-- <http://www.gnu.org/licenses/>. -- 26-- -- 27-- GNAT was originally developed by the GNAT team at New York University. -- 28-- Extensive contributions were provided by Ada Core Technologies Inc. -- 29-- -- 30------------------------------------------------------------------------------ 31 32-- This package plus its child provide the low level interface to the Win32 33-- API. The core part of the Win32 API (common to RTX and Win32) is in this 34-- package, and an additional part of the Win32 API which is not supported by 35-- RTX is in package System.Win32.Ext. 36 37with Interfaces.C; 38 39package System.Win32 is 40 pragma Pure; 41 42 ------------------- 43 -- General Types -- 44 ------------------- 45 46 -- The LARGE_INTEGER type is actually a fixed point type 47 -- that only can represent integers. The reason for this is 48 -- easier conversion to Duration or other fixed point types. 49 -- (See System.OS_Primitives.Clock, mingw and rtx versions.) 50 51 type LARGE_INTEGER is delta 1.0 range -2.0**63 .. 2.0**63 - 1.0; 52 53 subtype PVOID is Address; 54 55 type HANDLE is new Interfaces.C.ptrdiff_t; 56 57 INVALID_HANDLE_VALUE : constant HANDLE := -1; 58 INVALID_FILE_SIZE : constant := 16#FFFFFFFF#; 59 60 type ULONG is new Interfaces.C.unsigned_long; 61 type DWORD is new Interfaces.C.unsigned_long; 62 type WORD is new Interfaces.C.unsigned_short; 63 type BYTE is new Interfaces.C.unsigned_char; 64 type LONG is new Interfaces.C.long; 65 type CHAR is new Interfaces.C.char; 66 type SIZE_T is new Interfaces.C.size_t; 67 type DWORD_PTR is mod 2 ** Standard'Address_Size; 68 69 type BOOL is new Interfaces.C.int; 70 for BOOL'Size use Interfaces.C.int'Size; 71 72 type Bits1 is range 0 .. 2 ** 1 - 1; 73 type Bits2 is range 0 .. 2 ** 2 - 1; 74 type Bits17 is range 0 .. 2 ** 17 - 1; 75 for Bits1'Size use 1; 76 for Bits2'Size use 2; 77 for Bits17'Size use 17; 78 79 -- Note that the following clashes with standard names are to stay 80 -- compatible with the historical choice of following the C names. 81 82 pragma Warnings (Off); 83 FALSE : constant := 0; 84 TRUE : constant := 1; 85 pragma Warnings (On); 86 87 function GetLastError return DWORD; 88 pragma Import (Stdcall, GetLastError, "GetLastError"); 89 90 ----------- 91 -- Files -- 92 ----------- 93 94 CP_UTF8 : constant := 65001; 95 CP_ACP : constant := 0; 96 97 GENERIC_READ : constant := 16#80000000#; 98 GENERIC_WRITE : constant := 16#40000000#; 99 100 CREATE_NEW : constant := 1; 101 CREATE_ALWAYS : constant := 2; 102 OPEN_EXISTING : constant := 3; 103 OPEN_ALWAYS : constant := 4; 104 TRUNCATE_EXISTING : constant := 5; 105 106 FILE_SHARE_DELETE : constant := 16#00000004#; 107 FILE_SHARE_READ : constant := 16#00000001#; 108 FILE_SHARE_WRITE : constant := 16#00000002#; 109 110 FILE_BEGIN : constant := 0; 111 FILE_CURRENT : constant := 1; 112 FILE_END : constant := 2; 113 114 PAGE_NOACCESS : constant := 16#0001#; 115 PAGE_READONLY : constant := 16#0002#; 116 PAGE_READWRITE : constant := 16#0004#; 117 PAGE_WRITECOPY : constant := 16#0008#; 118 PAGE_EXECUTE : constant := 16#0010#; 119 120 FILE_MAP_ALL_ACCESS : constant := 16#F001f#; 121 FILE_MAP_READ : constant := 4; 122 FILE_MAP_WRITE : constant := 2; 123 FILE_MAP_COPY : constant := 1; 124 125 FILE_ADD_FILE : constant := 16#0002#; 126 FILE_ADD_SUBDIRECTORY : constant := 16#0004#; 127 FILE_APPEND_DATA : constant := 16#0004#; 128 FILE_CREATE_PIPE_INSTANCE : constant := 16#0004#; 129 FILE_DELETE_CHILD : constant := 16#0040#; 130 FILE_EXECUTE : constant := 16#0020#; 131 FILE_LIST_DIRECTORY : constant := 16#0001#; 132 FILE_READ_ATTRIBUTES : constant := 16#0080#; 133 FILE_READ_DATA : constant := 16#0001#; 134 FILE_READ_EA : constant := 16#0008#; 135 FILE_TRAVERSE : constant := 16#0020#; 136 FILE_WRITE_ATTRIBUTES : constant := 16#0100#; 137 FILE_WRITE_DATA : constant := 16#0002#; 138 FILE_WRITE_EA : constant := 16#0010#; 139 STANDARD_RIGHTS_READ : constant := 16#20000#; 140 STANDARD_RIGHTS_WRITE : constant := 16#20000#; 141 SYNCHRONIZE : constant := 16#100000#; 142 143 FILE_ATTRIBUTE_READONLY : constant := 16#00000001#; 144 FILE_ATTRIBUTE_HIDDEN : constant := 16#00000002#; 145 FILE_ATTRIBUTE_SYSTEM : constant := 16#00000004#; 146 FILE_ATTRIBUTE_DIRECTORY : constant := 16#00000010#; 147 FILE_ATTRIBUTE_ARCHIVE : constant := 16#00000020#; 148 FILE_ATTRIBUTE_DEVICE : constant := 16#00000040#; 149 FILE_ATTRIBUTE_NORMAL : constant := 16#00000080#; 150 FILE_ATTRIBUTE_TEMPORARY : constant := 16#00000100#; 151 FILE_ATTRIBUTE_SPARSE_FILE : constant := 16#00000200#; 152 FILE_ATTRIBUTE_REPARSE_POINT : constant := 16#00000400#; 153 FILE_ATTRIBUTE_COMPRESSED : constant := 16#00000800#; 154 FILE_ATTRIBUTE_OFFLINE : constant := 16#00001000#; 155 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED : constant := 16#00002000#; 156 FILE_ATTRIBUTE_ENCRYPTED : constant := 16#00004000#; 157 FILE_ATTRIBUTE_VALID_FLAGS : constant := 16#00007fb7#; 158 FILE_ATTRIBUTE_VALID_SET_FLAGS : constant := 16#000031a7#; 159 160 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS : constant := 16#00000004#; 161 162 type OVERLAPPED is record 163 Internal : access ULONG; 164 InternalHigh : access ULONG; 165 Offset : DWORD; 166 OffsetHigh : DWORD; 167 hEvent : HANDLE; 168 end record; 169 pragma Convention (C_Pass_By_Copy, OVERLAPPED); 170 171 type SECURITY_ATTRIBUTES is record 172 nLength : DWORD; 173 pSecurityDescriptor : PVOID; 174 bInheritHandle : BOOL; 175 end record; 176 pragma Convention (C_Pass_By_Copy, SECURITY_ATTRIBUTES); 177 178 function CreateFileA 179 (lpFileName : Address; 180 dwDesiredAccess : DWORD; 181 dwShareMode : DWORD; 182 lpSecurityAttributes : access SECURITY_ATTRIBUTES; 183 dwCreationDisposition : DWORD; 184 dwFlagsAndAttributes : DWORD; 185 hTemplateFile : HANDLE) return HANDLE; 186 pragma Import (Stdcall, CreateFileA, "CreateFileA"); 187 188 function CreateFile 189 (lpFileName : Address; 190 dwDesiredAccess : DWORD; 191 dwShareMode : DWORD; 192 lpSecurityAttributes : access SECURITY_ATTRIBUTES; 193 dwCreationDisposition : DWORD; 194 dwFlagsAndAttributes : DWORD; 195 hTemplateFile : HANDLE) return HANDLE; 196 pragma Import (Stdcall, CreateFile, "CreateFileW"); 197 198 function GetFileSize 199 (hFile : HANDLE; 200 lpFileSizeHigh : access DWORD) return BOOL; 201 pragma Import (Stdcall, GetFileSize, "GetFileSize"); 202 203 function SetFilePointer 204 (hFile : HANDLE; 205 lDistanceToMove : LONG; 206 lpDistanceToMoveHigh : access LONG; 207 dwMoveMethod : DWORD) return DWORD; 208 pragma Import (Stdcall, SetFilePointer, "SetFilePointer"); 209 210 function WriteFile 211 (hFile : HANDLE; 212 lpBuffer : Address; 213 nNumberOfBytesToWrite : DWORD; 214 lpNumberOfBytesWritten : access DWORD; 215 lpOverlapped : access OVERLAPPED) return BOOL; 216 pragma Import (Stdcall, WriteFile, "WriteFile"); 217 218 function ReadFile 219 (hFile : HANDLE; 220 lpBuffer : Address; 221 nNumberOfBytesToRead : DWORD; 222 lpNumberOfBytesRead : access DWORD; 223 lpOverlapped : access OVERLAPPED) return BOOL; 224 pragma Import (Stdcall, ReadFile, "ReadFile"); 225 226 function CloseHandle (hObject : HANDLE) return BOOL; 227 pragma Import (Stdcall, CloseHandle, "CloseHandle"); 228 229 function CreateFileMapping 230 (hFile : HANDLE; 231 lpSecurityAttributes : access SECURITY_ATTRIBUTES; 232 flProtect : DWORD; 233 dwMaximumSizeHigh : DWORD; 234 dwMaximumSizeLow : DWORD; 235 lpName : Address) return HANDLE; 236 pragma Import (Stdcall, CreateFileMapping, "CreateFileMappingA"); 237 238 function MapViewOfFile 239 (hFileMappingObject : HANDLE; 240 dwDesiredAccess : DWORD; 241 dwFileOffsetHigh : DWORD; 242 dwFileOffsetLow : DWORD; 243 dwNumberOfBytesToMap : SIZE_T) return System.Address; 244 pragma Import (Stdcall, MapViewOfFile, "MapViewOfFile"); 245 246 function UnmapViewOfFile (lpBaseAddress : System.Address) return BOOL; 247 pragma Import (Stdcall, UnmapViewOfFile, "UnmapViewOfFile"); 248 249 function MultiByteToWideChar 250 (CodePage : WORD; 251 dwFlags : DWORD; 252 lpMultiByteStr : System.Address; 253 cchMultiByte : WORD; 254 lpWideCharStr : System.Address; 255 cchWideChar : WORD) return WORD; 256 pragma Import (Stdcall, MultiByteToWideChar, "MultiByteToWideChar"); 257 258 ------------------------ 259 -- System Information -- 260 ------------------------ 261 262 subtype ProcessorId is DWORD; 263 264 type SYSTEM_INFO is record 265 dwOemId : DWORD; 266 dwPageSize : DWORD; 267 lpMinimumApplicationAddress : PVOID; 268 lpMaximumApplicationAddress : PVOID; 269 dwActiveProcessorMask : DWORD_PTR; 270 dwNumberOfProcessors : DWORD; 271 dwProcessorType : DWORD; 272 dwAllocationGranularity : DWORD; 273 dwReserved : DWORD; 274 end record; 275 pragma Convention (C_Pass_By_Copy, SYSTEM_INFO); 276 277 procedure GetSystemInfo (SI : access SYSTEM_INFO); 278 pragma Import (Stdcall, GetSystemInfo, "GetSystemInfo"); 279 280 --------------------- 281 -- Time Management -- 282 --------------------- 283 284 type SYSTEMTIME is record 285 wYear : WORD; 286 wMonth : WORD; 287 wDayOfWeek : WORD; 288 wDay : WORD; 289 wHour : WORD; 290 wMinute : WORD; 291 wSecond : WORD; 292 wMilliseconds : WORD; 293 end record; 294 pragma Convention (C_Pass_By_Copy, SYSTEMTIME); 295 296 procedure GetSystemTime (pSystemTime : access SYSTEMTIME); 297 pragma Import (Stdcall, GetSystemTime, "GetSystemTime"); 298 299 procedure GetSystemTimeAsFileTime (lpFileTime : access Long_Long_Integer); 300 pragma Import (Stdcall, GetSystemTimeAsFileTime, "GetSystemTimeAsFileTime"); 301 302 function FileTimeToSystemTime 303 (lpFileTime : access Long_Long_Integer; 304 lpSystemTime : access SYSTEMTIME) return BOOL; 305 pragma Import (Stdcall, FileTimeToSystemTime, "FileTimeToSystemTime"); 306 307 function SystemTimeToFileTime 308 (lpSystemTime : access SYSTEMTIME; 309 lpFileTime : access Long_Long_Integer) return BOOL; 310 pragma Import (Stdcall, SystemTimeToFileTime, "SystemTimeToFileTime"); 311 312 function FileTimeToLocalFileTime 313 (lpFileTime : access Long_Long_Integer; 314 lpLocalFileTime : access Long_Long_Integer) return BOOL; 315 pragma Import (Stdcall, FileTimeToLocalFileTime, "FileTimeToLocalFileTime"); 316 317 function LocalFileTimeToFileTime 318 (lpFileTime : access Long_Long_Integer; 319 lpLocalFileTime : access Long_Long_Integer) return BOOL; 320 pragma Import (Stdcall, LocalFileTimeToFileTime, "LocalFileTimeToFileTime"); 321 322 procedure Sleep (dwMilliseconds : DWORD); 323 pragma Import (Stdcall, Sleep, External_Name => "Sleep"); 324 325 function QueryPerformanceCounter 326 (lpPerformanceCount : access LARGE_INTEGER) return BOOL; 327 pragma Import 328 (Stdcall, QueryPerformanceCounter, "QueryPerformanceCounter"); 329 330 ------------ 331 -- Module -- 332 ------------ 333 334 function GetModuleHandleEx 335 (dwFlags : DWORD; 336 lpModuleName : Address; 337 phModule : access HANDLE) return BOOL; 338 pragma Import (Stdcall, GetModuleHandleEx, "GetModuleHandleExA"); 339 340 function GetModuleFileName 341 (hModule : HANDLE; 342 lpFilename : Address; 343 nSize : DWORD) return DWORD; 344 pragma Import (Stdcall, GetModuleFileName, "GetModuleFileNameA"); 345 346 function FreeLibrary (hModule : HANDLE) return BOOL; 347 pragma Import (Stdcall, FreeLibrary, "FreeLibrary"); 348 349end System.Win32; 350