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-2019, 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 DWORD is new Interfaces.C.unsigned_long; 61 type WORD is new Interfaces.C.unsigned_short; 62 type BYTE is new Interfaces.C.unsigned_char; 63 type LONG is new Interfaces.C.long; 64 type CHAR is new Interfaces.C.char; 65 66 type BOOL is new Interfaces.C.int; 67 for BOOL'Size use Interfaces.C.int'Size; 68 69 type Bits1 is range 0 .. 2 ** 1 - 1; 70 type Bits2 is range 0 .. 2 ** 2 - 1; 71 type Bits17 is range 0 .. 2 ** 17 - 1; 72 for Bits1'Size use 1; 73 for Bits2'Size use 2; 74 for Bits17'Size use 17; 75 76 -- Note that the following clashes with standard names are to stay 77 -- compatible with the historical choice of following the C names. 78 79 pragma Warnings (Off); 80 FALSE : constant := 0; 81 TRUE : constant := 1; 82 pragma Warnings (On); 83 84 function GetLastError return DWORD; 85 pragma Import (Stdcall, GetLastError, "GetLastError"); 86 87 ----------- 88 -- Files -- 89 ----------- 90 91 CP_UTF8 : constant := 65001; 92 CP_ACP : constant := 0; 93 94 GENERIC_READ : constant := 16#80000000#; 95 GENERIC_WRITE : constant := 16#40000000#; 96 97 CREATE_NEW : constant := 1; 98 CREATE_ALWAYS : constant := 2; 99 OPEN_EXISTING : constant := 3; 100 OPEN_ALWAYS : constant := 4; 101 TRUNCATE_EXISTING : constant := 5; 102 103 FILE_SHARE_DELETE : constant := 16#00000004#; 104 FILE_SHARE_READ : constant := 16#00000001#; 105 FILE_SHARE_WRITE : constant := 16#00000002#; 106 107 FILE_BEGIN : constant := 0; 108 FILE_CURRENT : constant := 1; 109 FILE_END : constant := 2; 110 111 PAGE_NOACCESS : constant := 16#0001#; 112 PAGE_READONLY : constant := 16#0002#; 113 PAGE_READWRITE : constant := 16#0004#; 114 PAGE_WRITECOPY : constant := 16#0008#; 115 PAGE_EXECUTE : constant := 16#0010#; 116 117 FILE_MAP_ALL_ACCESS : constant := 16#F001f#; 118 FILE_MAP_READ : constant := 4; 119 FILE_MAP_WRITE : constant := 2; 120 FILE_MAP_COPY : constant := 1; 121 122 FILE_ADD_FILE : constant := 16#0002#; 123 FILE_ADD_SUBDIRECTORY : constant := 16#0004#; 124 FILE_APPEND_DATA : constant := 16#0004#; 125 FILE_CREATE_PIPE_INSTANCE : constant := 16#0004#; 126 FILE_DELETE_CHILD : constant := 16#0040#; 127 FILE_EXECUTE : constant := 16#0020#; 128 FILE_LIST_DIRECTORY : constant := 16#0001#; 129 FILE_READ_ATTRIBUTES : constant := 16#0080#; 130 FILE_READ_DATA : constant := 16#0001#; 131 FILE_READ_EA : constant := 16#0008#; 132 FILE_TRAVERSE : constant := 16#0020#; 133 FILE_WRITE_ATTRIBUTES : constant := 16#0100#; 134 FILE_WRITE_DATA : constant := 16#0002#; 135 FILE_WRITE_EA : constant := 16#0010#; 136 STANDARD_RIGHTS_READ : constant := 16#20000#; 137 STANDARD_RIGHTS_WRITE : constant := 16#20000#; 138 SYNCHRONIZE : constant := 16#100000#; 139 140 FILE_ATTRIBUTE_READONLY : constant := 16#00000001#; 141 FILE_ATTRIBUTE_HIDDEN : constant := 16#00000002#; 142 FILE_ATTRIBUTE_SYSTEM : constant := 16#00000004#; 143 FILE_ATTRIBUTE_DIRECTORY : constant := 16#00000010#; 144 FILE_ATTRIBUTE_ARCHIVE : constant := 16#00000020#; 145 FILE_ATTRIBUTE_DEVICE : constant := 16#00000040#; 146 FILE_ATTRIBUTE_NORMAL : constant := 16#00000080#; 147 FILE_ATTRIBUTE_TEMPORARY : constant := 16#00000100#; 148 FILE_ATTRIBUTE_SPARSE_FILE : constant := 16#00000200#; 149 FILE_ATTRIBUTE_REPARSE_POINT : constant := 16#00000400#; 150 FILE_ATTRIBUTE_COMPRESSED : constant := 16#00000800#; 151 FILE_ATTRIBUTE_OFFLINE : constant := 16#00001000#; 152 FILE_ATTRIBUTE_NOT_CONTENT_INDEXED : constant := 16#00002000#; 153 FILE_ATTRIBUTE_ENCRYPTED : constant := 16#00004000#; 154 FILE_ATTRIBUTE_VALID_FLAGS : constant := 16#00007fb7#; 155 FILE_ATTRIBUTE_VALID_SET_FLAGS : constant := 16#000031a7#; 156 157 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS : constant := 16#00000004#; 158 159 type OVERLAPPED is record 160 Internal : DWORD; 161 InternalHigh : DWORD; 162 Offset : DWORD; 163 OffsetHigh : DWORD; 164 hEvent : HANDLE; 165 end record; 166 167 type SECURITY_ATTRIBUTES is record 168 nLength : DWORD; 169 pSecurityDescriptor : PVOID; 170 bInheritHandle : BOOL; 171 end record; 172 173 function CreateFileA 174 (lpFileName : Address; 175 dwDesiredAccess : DWORD; 176 dwShareMode : DWORD; 177 lpSecurityAttributes : access SECURITY_ATTRIBUTES; 178 dwCreationDisposition : DWORD; 179 dwFlagsAndAttributes : DWORD; 180 hTemplateFile : HANDLE) return HANDLE; 181 pragma Import (Stdcall, CreateFileA, "CreateFileA"); 182 183 function CreateFile 184 (lpFileName : Address; 185 dwDesiredAccess : DWORD; 186 dwShareMode : DWORD; 187 lpSecurityAttributes : access SECURITY_ATTRIBUTES; 188 dwCreationDisposition : DWORD; 189 dwFlagsAndAttributes : DWORD; 190 hTemplateFile : HANDLE) return HANDLE; 191 pragma Import (Stdcall, CreateFile, "CreateFileW"); 192 193 function GetFileSize 194 (hFile : HANDLE; 195 lpFileSizeHigh : access DWORD) return BOOL; 196 pragma Import (Stdcall, GetFileSize, "GetFileSize"); 197 198 function SetFilePointer 199 (hFile : HANDLE; 200 lDistanceToMove : LONG; 201 lpDistanceToMoveHigh : access LONG; 202 dwMoveMethod : DWORD) return DWORD; 203 pragma Import (Stdcall, SetFilePointer, "SetFilePointer"); 204 205 function WriteFile 206 (hFile : HANDLE; 207 lpBuffer : Address; 208 nNumberOfBytesToWrite : DWORD; 209 lpNumberOfBytesWritten : access DWORD; 210 lpOverlapped : access OVERLAPPED) return BOOL; 211 pragma Import (Stdcall, WriteFile, "WriteFile"); 212 213 function ReadFile 214 (hFile : HANDLE; 215 lpBuffer : Address; 216 nNumberOfBytesToRead : DWORD; 217 lpNumberOfBytesRead : access DWORD; 218 lpOverlapped : access OVERLAPPED) return BOOL; 219 pragma Import (Stdcall, ReadFile, "ReadFile"); 220 221 function CloseHandle (hObject : HANDLE) return BOOL; 222 pragma Import (Stdcall, CloseHandle, "CloseHandle"); 223 224 function CreateFileMapping 225 (hFile : HANDLE; 226 lpSecurityAttributes : access SECURITY_ATTRIBUTES; 227 flProtect : DWORD; 228 dwMaximumSizeHigh : DWORD; 229 dwMaximumSizeLow : DWORD; 230 lpName : Address) return HANDLE; 231 pragma Import (Stdcall, CreateFileMapping, "CreateFileMappingA"); 232 233 function MapViewOfFile 234 (hFileMappingObject : HANDLE; 235 dwDesiredAccess : DWORD; 236 dwFileOffsetHigh : DWORD; 237 dwFileOffsetLow : DWORD; 238 dwNumberOfBytesToMap : DWORD) return System.Address; 239 pragma Import (Stdcall, MapViewOfFile, "MapViewOfFile"); 240 241 function UnmapViewOfFile (lpBaseAddress : System.Address) return BOOL; 242 pragma Import (Stdcall, UnmapViewOfFile, "UnmapViewOfFile"); 243 244 function MultiByteToWideChar 245 (CodePage : WORD; 246 dwFlags : DWORD; 247 lpMultiByteStr : System.Address; 248 cchMultiByte : WORD; 249 lpWideCharStr : System.Address; 250 cchWideChar : WORD) return WORD; 251 pragma Import (Stdcall, MultiByteToWideChar, "MultiByteToWideChar"); 252 253 ------------------------ 254 -- System Information -- 255 ------------------------ 256 257 subtype ProcessorId is DWORD; 258 259 type SYSTEM_INFO is record 260 dwOemId : DWORD; 261 dwPageSize : DWORD; 262 lpMinimumApplicationAddress : PVOID; 263 lpMaximumApplicationAddress : PVOID; 264 dwActiveProcessorMask : DWORD; 265 dwNumberOfProcessors : DWORD; 266 dwProcessorType : DWORD; 267 dwAllocationGranularity : DWORD; 268 dwReserved : DWORD; 269 end record; 270 271 procedure GetSystemInfo (SI : access SYSTEM_INFO); 272 pragma Import (Stdcall, GetSystemInfo, "GetSystemInfo"); 273 274 --------------------- 275 -- Time Management -- 276 --------------------- 277 278 type SYSTEMTIME is record 279 wYear : WORD; 280 wMonth : WORD; 281 wDayOfWeek : WORD; 282 wDay : WORD; 283 wHour : WORD; 284 wMinute : WORD; 285 wSecond : WORD; 286 wMilliseconds : WORD; 287 end record; 288 289 procedure GetSystemTime (pSystemTime : access SYSTEMTIME); 290 pragma Import (Stdcall, GetSystemTime, "GetSystemTime"); 291 292 procedure GetSystemTimeAsFileTime (lpFileTime : access Long_Long_Integer); 293 pragma Import (Stdcall, GetSystemTimeAsFileTime, "GetSystemTimeAsFileTime"); 294 295 function FileTimeToSystemTime 296 (lpFileTime : access Long_Long_Integer; 297 lpSystemTime : access SYSTEMTIME) return BOOL; 298 pragma Import (Stdcall, FileTimeToSystemTime, "FileTimeToSystemTime"); 299 300 function SystemTimeToFileTime 301 (lpSystemTime : access SYSTEMTIME; 302 lpFileTime : access Long_Long_Integer) return BOOL; 303 pragma Import (Stdcall, SystemTimeToFileTime, "SystemTimeToFileTime"); 304 305 function FileTimeToLocalFileTime 306 (lpFileTime : access Long_Long_Integer; 307 lpLocalFileTime : access Long_Long_Integer) return BOOL; 308 pragma Import (Stdcall, FileTimeToLocalFileTime, "FileTimeToLocalFileTime"); 309 310 function LocalFileTimeToFileTime 311 (lpFileTime : access Long_Long_Integer; 312 lpLocalFileTime : access Long_Long_Integer) return BOOL; 313 pragma Import (Stdcall, LocalFileTimeToFileTime, "LocalFileTimeToFileTime"); 314 315 procedure Sleep (dwMilliseconds : DWORD); 316 pragma Import (Stdcall, Sleep, External_Name => "Sleep"); 317 318 function QueryPerformanceCounter 319 (lpPerformanceCount : access LARGE_INTEGER) return BOOL; 320 pragma Import 321 (Stdcall, QueryPerformanceCounter, "QueryPerformanceCounter"); 322 323 ------------ 324 -- Module -- 325 ------------ 326 327 function GetModuleHandleEx 328 (dwFlags : DWORD; 329 lpModuleName : Address; 330 phModule : access HANDLE) return BOOL; 331 pragma Import (Stdcall, GetModuleHandleEx, "GetModuleHandleExA"); 332 333 function GetModuleFileName 334 (hModule : HANDLE; 335 lpFilename : Address; 336 nSize : DWORD) return DWORD; 337 pragma Import (Stdcall, GetModuleFileName, "GetModuleFileNameA"); 338 339 function FreeLibrary (hModule : HANDLE) return BOOL; 340 pragma Import (Stdcall, FreeLibrary, "FreeLibrary"); 341 342end System.Win32; 343