48_mingw_allow_for_winternl_differences.patch (11534B)
1 # User Bob Owen <bobowencode@gmail.com> 2 This #ifs out various things that are already defined in mingw's winternl.h but 3 not in the standard Windows one. It also renames _OBJECT_TYPE_INFORMATION::Name 4 to TypeName and _OBJECT_NAME_INFORMATION::ObjectName to Name to match Windows 5 documentation and mingw. 6 7 diff --git a/sandbox/win/src/nt_internals.h b/sandbox/win/src/nt_internals.h 8 --- a/sandbox/win/src/nt_internals.h 9 +++ b/sandbox/win/src/nt_internals.h 10 @@ -35,57 +35,63 @@ typedef NTSTATUS(WINAPI* NtOpenFileFunct 11 IN POBJECT_ATTRIBUTES 12 ObjectAttributes, 13 OUT PIO_STATUS_BLOCK IoStatusBlock, 14 IN ULONG ShareAccess, 15 IN ULONG OpenOptions); 16 17 typedef NTSTATUS(WINAPI* NtCloseFunction)(IN HANDLE Handle); 18 19 +#if !defined(__MINGW32__) 20 // Uses undocumented value not in FILE_INFORMATION_CLASS. 21 #pragma clang diagnostic push 22 #pragma clang diagnostic ignored "-Wenum-constexpr-conversion" 23 constexpr auto FileRenameInformation = static_cast<FILE_INFORMATION_CLASS>(10); 24 #pragma clang diagnostic push 25 26 typedef struct _FILE_RENAME_INFORMATION { 27 BOOLEAN ReplaceIfExists; 28 HANDLE RootDirectory; 29 ULONG FileNameLength; 30 WCHAR FileName[1]; 31 } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION; 32 +#endif 33 34 typedef NTSTATUS(WINAPI* NtSetInformationFileFunction)( 35 IN HANDLE FileHandle, 36 OUT PIO_STATUS_BLOCK IoStatusBlock, 37 IN PVOID FileInformation, 38 IN ULONG Length, 39 IN FILE_INFORMATION_CLASS FileInformationClass); 40 41 +#if !defined(__MINGW32__) 42 typedef struct FILE_BASIC_INFORMATION { 43 LARGE_INTEGER CreationTime; 44 LARGE_INTEGER LastAccessTime; 45 LARGE_INTEGER LastWriteTime; 46 LARGE_INTEGER ChangeTime; 47 ULONG FileAttributes; 48 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; 49 +#endif 50 51 typedef NTSTATUS(WINAPI* NtQueryAttributesFileFunction)( 52 IN POBJECT_ATTRIBUTES ObjectAttributes, 53 OUT PFILE_BASIC_INFORMATION FileAttributes); 54 55 +#if !defined(__MINGW32__) 56 typedef struct _FILE_NETWORK_OPEN_INFORMATION { 57 LARGE_INTEGER CreationTime; 58 LARGE_INTEGER LastAccessTime; 59 LARGE_INTEGER LastWriteTime; 60 LARGE_INTEGER ChangeTime; 61 LARGE_INTEGER AllocationSize; 62 LARGE_INTEGER EndOfFile; 63 ULONG FileAttributes; 64 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION; 65 +#endif 66 67 typedef NTSTATUS(WINAPI* NtQueryFullAttributesFileFunction)( 68 IN POBJECT_ATTRIBUTES ObjectAttributes, 69 OUT PFILE_NETWORK_OPEN_INFORMATION FileAttributes); 70 71 // ----------------------------------------------------------------------- 72 // Sections 73 74 @@ -148,18 +154,20 @@ typedef NTSTATUS(WINAPI* NtOpenThreadFun 75 IN PCLIENT_ID ClientId); 76 77 typedef NTSTATUS(WINAPI* NtOpenProcessFunction)(OUT PHANDLE ProcessHandle, 78 IN ACCESS_MASK DesiredAccess, 79 IN POBJECT_ATTRIBUTES 80 ObjectAttributes, 81 IN PCLIENT_ID ClientId); 82 83 +#if !defined(__MINGW32__) 84 // Provide ThreadImpersonationToken which is not in THREADINFOCLASS. 85 constexpr auto ThreadImpersonationToken = static_cast<THREADINFOCLASS>(5); 86 +#endif 87 88 typedef NTSTATUS(WINAPI* NtImpersonateAnonymousTokenFunction)( 89 IN HANDLE ThreadHandle); 90 91 typedef NTSTATUS(WINAPI* NtOpenSectionFunction)( 92 OUT PHANDLE SectionHandle, IN ACCESS_MASK DesiredAccess, 93 IN POBJECT_ATTRIBUTES ObjectAttributes); 94 95 @@ -235,18 +243,20 @@ typedef NTSTATUS(WINAPI* NtOpenKeyFuncti 96 97 typedef NTSTATUS(WINAPI* NtOpenKeyExFunction)( 98 OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, 99 IN POBJECT_ATTRIBUTES ObjectAttributes, IN DWORD open_options); 100 101 // ----------------------------------------------------------------------- 102 // Memory 103 104 +#if !defined(__MINGW32__) 105 // Don't really need this structure right now. 106 typedef PVOID PRTL_HEAP_PARAMETERS; 107 +#endif 108 109 typedef PVOID(WINAPI* RtlCreateHeapFunction)(IN ULONG Flags, 110 IN PVOID HeapBase OPTIONAL, 111 IN SIZE_T ReserveSize OPTIONAL, 112 IN SIZE_T CommitSize OPTIONAL, 113 IN PVOID Lock OPTIONAL, 114 IN PRTL_HEAP_PARAMETERS Parameters 115 OPTIONAL); 116 @@ -298,45 +308,48 @@ typedef NTSTATUS(WINAPI* NtProtectVirtua 117 IN OUT PVOID* BaseAddress, 118 IN OUT PSIZE_T ProtectSize, 119 IN ULONG NewProtect, 120 OUT PULONG OldProtect); 121 122 // ----------------------------------------------------------------------- 123 // Objects 124 125 +#if !defined(__MINGW32__) 126 // Add some field not in OBJECT_INFORMATION_CLASS. 127 constexpr auto ObjectNameInformation = static_cast<OBJECT_INFORMATION_CLASS>(1); 128 +#endif 129 130 typedef enum _POOL_TYPE { 131 NonPagedPool, 132 PagedPool, 133 NonPagedPoolMustSucceed, 134 ReservedType, 135 NonPagedPoolCacheAligned, 136 PagedPoolCacheAligned, 137 NonPagedPoolCacheAlignedMustS 138 } POOL_TYPE; 139 140 +#if !defined(__MINGW32__) 141 typedef struct _OBJECT_BASIC_INFORMATION { 142 ULONG Attributes; 143 ACCESS_MASK GrantedAccess; 144 ULONG HandleCount; 145 ULONG PointerCount; 146 ULONG PagedPoolUsage; 147 ULONG NonPagedPoolUsage; 148 ULONG Reserved[3]; 149 ULONG NameInformationLength; 150 ULONG TypeInformationLength; 151 ULONG SecurityDescriptorLength; 152 LARGE_INTEGER CreateTime; 153 } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION; 154 155 typedef struct _OBJECT_TYPE_INFORMATION { 156 - UNICODE_STRING Name; 157 + UNICODE_STRING TypeName; 158 ULONG TotalNumberOfObjects; 159 ULONG TotalNumberOfHandles; 160 ULONG TotalPagedPoolUsage; 161 ULONG TotalNonPagedPoolUsage; 162 ULONG TotalNamePoolUsage; 163 ULONG TotalHandleTableUsage; 164 ULONG HighWaterNumberOfObjects; 165 ULONG HighWaterNumberOfHandles; 166 @@ -351,18 +364,19 @@ typedef struct _OBJECT_TYPE_INFORMATION 167 BOOLEAN MaintainHandleCount; 168 USHORT MaintainTypeList; 169 POOL_TYPE PoolType; 170 ULONG PagedPoolUsage; 171 ULONG NonPagedPoolUsage; 172 } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; 173 174 typedef struct _OBJECT_NAME_INFORMATION { 175 - UNICODE_STRING ObjectName; 176 + UNICODE_STRING Name; 177 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; 178 +#endif 179 180 typedef NTSTATUS(WINAPI* NtQueryObjectFunction)( 181 IN HANDLE Handle, 182 IN OBJECT_INFORMATION_CLASS ObjectInformationClass, 183 OUT PVOID ObjectInformation OPTIONAL, 184 IN ULONG ObjectInformationLength, 185 OUT PULONG ReturnLength OPTIONAL); 186 187 diff --git a/sandbox/win/src/sandbox_nt_util.cc b/sandbox/win/src/sandbox_nt_util.cc 188 --- a/sandbox/win/src/sandbox_nt_util.cc 189 +++ b/sandbox/win/src/sandbox_nt_util.cc 190 @@ -396,24 +396,24 @@ NTSTATUS AllocAndGetFullPath( 191 ret = NtQueryObject(root, ObjectNameInformation, handle_name.get(), 192 size, &size); 193 } 194 195 if (STATUS_SUCCESS != ret) break; 196 197 // Space for path + '\' + name + '\0'. 198 size_t name_length = 199 - handle_name->ObjectName.Length + (wcslen(path) + 2) * sizeof(wchar_t); 200 + handle_name->Name.Length + (wcslen(path) + 2) * sizeof(wchar_t); 201 full_path->reset(new (NT_ALLOC) wchar_t[name_length / sizeof(wchar_t)]); 202 if (!*full_path) break; 203 wchar_t* off = full_path->get(); 204 - ret = CopyData(off, handle_name->ObjectName.Buffer, 205 - handle_name->ObjectName.Length); 206 + ret = CopyData(off, handle_name->Name.Buffer, 207 + handle_name->Name.Length); 208 if (!NT_SUCCESS(ret)) break; 209 - off += handle_name->ObjectName.Length / sizeof(wchar_t); 210 + off += handle_name->Name.Length / sizeof(wchar_t); 211 *off = L'\\'; 212 off += 1; 213 ret = CopyData(off, path, wcslen(path) * sizeof(wchar_t)); 214 if (!NT_SUCCESS(ret)) break; 215 off += wcslen(path); 216 *off = L'\0'; 217 } while (false); 218 } __except (EXCEPTION_EXECUTE_HANDLER) { 219 @@ -805,20 +805,20 @@ bool NtGetPathFromHandle(HANDLE handle, 220 221 // Query the name information a second time to get the name of the 222 // object referenced by the handle. 223 status = GetNtExports()->QueryObject(handle, ObjectNameInformation, name, 224 size, &size); 225 226 if (STATUS_SUCCESS != status) 227 return false; 228 - size_t num_path_wchars = (name->ObjectName.Length / sizeof(wchar_t)) + 1; 229 + size_t num_path_wchars = (name->Name.Length / sizeof(wchar_t)) + 1; 230 path->reset(new (NT_ALLOC) wchar_t[num_path_wchars]); 231 status = 232 - CopyData(path->get(), name->ObjectName.Buffer, name->ObjectName.Length); 233 + CopyData(path->get(), name->Name.Buffer, name->Name.Length); 234 path->get()[num_path_wchars - 1] = L'\0'; 235 if (STATUS_SUCCESS != status) 236 return false; 237 return true; 238 } 239 240 CLIENT_ID GetCurrentClientId() { 241 return reinterpret_cast<PARTIAL_TEB*>(NtCurrentTeb())->ClientId; 242 diff --git a/sandbox/win/src/signed_interception.cc b/sandbox/win/src/signed_interception.cc 243 --- a/sandbox/win/src/signed_interception.cc 244 +++ b/sandbox/win/src/signed_interception.cc 245 @@ -67,17 +67,17 @@ TargetNtCreateSection(NtCreateSectionFun 246 GetNtExports()->QueryObject(file_handle, ObjectNameInformation, path, 247 path_buffer_size, &out_buffer_size); 248 249 if (!NT_SUCCESS(status)) { 250 break; 251 } 252 253 CountedParameterSet<NameBased> params; 254 - params[NameBased::NAME] = ParamPickerMake(path->ObjectName.Buffer); 255 + params[NameBased::NAME] = ParamPickerMake(path->Name.Buffer); 256 257 // Check if this will be sent to the broker. 258 if (!QueryBroker(IpcTag::NTCREATESECTION, params.GetBase())) 259 break; 260 261 if (!ValidParameter(section_handle, sizeof(HANDLE), WRITE)) 262 break; 263 264 diff --git a/sandbox/win/src/win_utils.cc b/sandbox/win/src/win_utils.cc 265 --- a/sandbox/win/src/win_utils.cc 266 +++ b/sandbox/win/src/win_utils.cc 267 @@ -453,30 +453,30 @@ absl::optional<std::wstring> GetNtPathFr 268 269 absl::optional<std::wstring> GetPathFromHandle(HANDLE handle) { 270 auto buffer = QueryObjectInformation(handle, ObjectNameInformation, 512); 271 if (!buffer) 272 return absl::nullopt; 273 OBJECT_NAME_INFORMATION* name = 274 reinterpret_cast<OBJECT_NAME_INFORMATION*>(buffer->data()); 275 return std::wstring( 276 - name->ObjectName.Buffer, 277 - name->ObjectName.Length / sizeof(name->ObjectName.Buffer[0])); 278 + name->Name.Buffer, 279 + name->Name.Length / sizeof(name->Name.Buffer[0])); 280 } 281 282 absl::optional<std::wstring> GetTypeNameFromHandle(HANDLE handle) { 283 // No typename is currently longer than 32 characters on Windows 11, so use a 284 // hint of 128 bytes. 285 auto buffer = QueryObjectInformation(handle, ObjectTypeInformation, 128); 286 if (!buffer) 287 return absl::nullopt; 288 OBJECT_TYPE_INFORMATION* name = 289 reinterpret_cast<OBJECT_TYPE_INFORMATION*>(buffer->data()); 290 - return std::wstring(name->Name.Buffer, 291 - name->Name.Length / sizeof(name->Name.Buffer[0])); 292 + return std::wstring(name->TypeName.Buffer, 293 + name->TypeName.Length / sizeof(name->TypeName.Buffer[0])); 294 } 295 296 bool CopyToChildMemory(HANDLE child, 297 const void* local_buffer, 298 size_t buffer_bytes, 299 void** remote_buffer) { 300 DCHECK(remote_buffer); 301 if (0 == buffer_bytes) {