tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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) {