Source code
Revision control
Copy as Markdown
Other Tools
# User Bob Owen <bobowencode@gmail.com>
This #ifs out various things that are already defined in mingw's winternl.h but
not in the standard Windows one. It also renames _OBJECT_TYPE_INFORMATION::Name
to TypeName and _OBJECT_NAME_INFORMATION::ObjectName to Name to match Windows
documentation and mingw.
diff --git a/sandbox/win/src/nt_internals.h b/sandbox/win/src/nt_internals.h
--- a/sandbox/win/src/nt_internals.h
+++ b/sandbox/win/src/nt_internals.h
@@ -35,57 +35,63 @@ typedef NTSTATUS(WINAPI* NtOpenFileFunct
IN POBJECT_ATTRIBUTES
ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG ShareAccess,
IN ULONG OpenOptions);
typedef NTSTATUS(WINAPI* NtCloseFunction)(IN HANDLE Handle);
+#if !defined(__MINGW32__)
// Uses undocumented value not in FILE_INFORMATION_CLASS.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wenum-constexpr-conversion"
constexpr auto FileRenameInformation = static_cast<FILE_INFORMATION_CLASS>(10);
#pragma clang diagnostic push
typedef struct _FILE_RENAME_INFORMATION {
BOOLEAN ReplaceIfExists;
HANDLE RootDirectory;
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
+#endif
typedef NTSTATUS(WINAPI* NtSetInformationFileFunction)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass);
+#if !defined(__MINGW32__)
typedef struct FILE_BASIC_INFORMATION {
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
ULONG FileAttributes;
} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
+#endif
typedef NTSTATUS(WINAPI* NtQueryAttributesFileFunction)(
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PFILE_BASIC_INFORMATION FileAttributes);
+#if !defined(__MINGW32__)
typedef struct _FILE_NETWORK_OPEN_INFORMATION {
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER AllocationSize;
LARGE_INTEGER EndOfFile;
ULONG FileAttributes;
} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
+#endif
typedef NTSTATUS(WINAPI* NtQueryFullAttributesFileFunction)(
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PFILE_NETWORK_OPEN_INFORMATION FileAttributes);
// -----------------------------------------------------------------------
// Sections
@@ -148,18 +154,20 @@ typedef NTSTATUS(WINAPI* NtOpenThreadFun
IN PCLIENT_ID ClientId);
typedef NTSTATUS(WINAPI* NtOpenProcessFunction)(OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES
ObjectAttributes,
IN PCLIENT_ID ClientId);
+#if !defined(__MINGW32__)
// Provide ThreadImpersonationToken which is not in THREADINFOCLASS.
constexpr auto ThreadImpersonationToken = static_cast<THREADINFOCLASS>(5);
+#endif
typedef NTSTATUS(WINAPI* NtImpersonateAnonymousTokenFunction)(
IN HANDLE ThreadHandle);
typedef NTSTATUS(WINAPI* NtSetInformationThreadFunction)(
IN HANDLE ThreadHandle,
IN THREADINFOCLASS ThreadInformationClass,
IN PVOID ThreadInformation,
@@ -235,18 +243,20 @@ typedef NTSTATUS(WINAPI* NtOpenKeyFuncti
typedef NTSTATUS(WINAPI* NtOpenKeyExFunction)(
OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes, IN DWORD open_options);
// -----------------------------------------------------------------------
// Memory
+#if !defined(__MINGW32__)
// Don't really need this structure right now.
typedef PVOID PRTL_HEAP_PARAMETERS;
+#endif
typedef PVOID(WINAPI* RtlCreateHeapFunction)(IN ULONG Flags,
IN PVOID HeapBase OPTIONAL,
IN SIZE_T ReserveSize OPTIONAL,
IN SIZE_T CommitSize OPTIONAL,
IN PVOID Lock OPTIONAL,
IN PRTL_HEAP_PARAMETERS Parameters
OPTIONAL);
@@ -298,45 +308,48 @@ typedef NTSTATUS(WINAPI* NtProtectVirtua
IN OUT PVOID* BaseAddress,
IN OUT PSIZE_T ProtectSize,
IN ULONG NewProtect,
OUT PULONG OldProtect);
// -----------------------------------------------------------------------
// Objects
+#if !defined(__MINGW32__)
// Add some field not in OBJECT_INFORMATION_CLASS.
constexpr auto ObjectNameInformation = static_cast<OBJECT_INFORMATION_CLASS>(1);
+#endif
typedef enum _POOL_TYPE {
NonPagedPool,
PagedPool,
NonPagedPoolMustSucceed,
ReservedType,
NonPagedPoolCacheAligned,
PagedPoolCacheAligned,
NonPagedPoolCacheAlignedMustS
} POOL_TYPE;
+#if !defined(__MINGW32__)
typedef struct _OBJECT_BASIC_INFORMATION {
ULONG Attributes;
ACCESS_MASK GrantedAccess;
ULONG HandleCount;
ULONG PointerCount;
ULONG PagedPoolUsage;
ULONG NonPagedPoolUsage;
ULONG Reserved[3];
ULONG NameInformationLength;
ULONG TypeInformationLength;
ULONG SecurityDescriptorLength;
LARGE_INTEGER CreateTime;
} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
typedef struct _OBJECT_TYPE_INFORMATION {
- UNICODE_STRING Name;
+ UNICODE_STRING TypeName;
ULONG TotalNumberOfObjects;
ULONG TotalNumberOfHandles;
ULONG TotalPagedPoolUsage;
ULONG TotalNonPagedPoolUsage;
ULONG TotalNamePoolUsage;
ULONG TotalHandleTableUsage;
ULONG HighWaterNumberOfObjects;
ULONG HighWaterNumberOfHandles;
@@ -351,18 +364,19 @@ typedef struct _OBJECT_TYPE_INFORMATION
BOOLEAN MaintainHandleCount;
USHORT MaintainTypeList;
POOL_TYPE PoolType;
ULONG PagedPoolUsage;
ULONG NonPagedPoolUsage;
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
typedef struct _OBJECT_NAME_INFORMATION {
- UNICODE_STRING ObjectName;
+ UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
+#endif
typedef NTSTATUS(WINAPI* NtQueryObjectFunction)(
IN HANDLE Handle,
IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
OUT PVOID ObjectInformation OPTIONAL,
IN ULONG ObjectInformationLength,
OUT PULONG ReturnLength OPTIONAL);
diff --git a/sandbox/win/src/sandbox_nt_util.cc b/sandbox/win/src/sandbox_nt_util.cc
--- a/sandbox/win/src/sandbox_nt_util.cc
+++ b/sandbox/win/src/sandbox_nt_util.cc
@@ -396,24 +396,24 @@ NTSTATUS AllocAndGetFullPath(
ret = NtQueryObject(root, ObjectNameInformation, handle_name.get(),
size, &size);
}
if (STATUS_SUCCESS != ret) break;
// Space for path + '\' + name + '\0'.
size_t name_length =
- handle_name->ObjectName.Length + (wcslen(path) + 2) * sizeof(wchar_t);
+ handle_name->Name.Length + (wcslen(path) + 2) * sizeof(wchar_t);
full_path->reset(new (NT_ALLOC) wchar_t[name_length / sizeof(wchar_t)]);
if (!*full_path) break;
wchar_t* off = full_path->get();
- ret = CopyData(off, handle_name->ObjectName.Buffer,
- handle_name->ObjectName.Length);
+ ret = CopyData(off, handle_name->Name.Buffer,
+ handle_name->Name.Length);
if (!NT_SUCCESS(ret)) break;
- off += handle_name->ObjectName.Length / sizeof(wchar_t);
+ off += handle_name->Name.Length / sizeof(wchar_t);
*off = L'\\';
off += 1;
ret = CopyData(off, path, wcslen(path) * sizeof(wchar_t));
if (!NT_SUCCESS(ret)) break;
off += wcslen(path);
*off = L'\0';
} while (false);
} __except (EXCEPTION_EXECUTE_HANDLER) {
@@ -805,20 +805,20 @@ bool NtGetPathFromHandle(HANDLE handle,
// Query the name information a second time to get the name of the
// object referenced by the handle.
status = GetNtExports()->QueryObject(handle, ObjectNameInformation, name,
size, &size);
if (STATUS_SUCCESS != status)
return false;
- size_t num_path_wchars = (name->ObjectName.Length / sizeof(wchar_t)) + 1;
+ size_t num_path_wchars = (name->Name.Length / sizeof(wchar_t)) + 1;
path->reset(new (NT_ALLOC) wchar_t[num_path_wchars]);
status =
- CopyData(path->get(), name->ObjectName.Buffer, name->ObjectName.Length);
+ CopyData(path->get(), name->Name.Buffer, name->Name.Length);
path->get()[num_path_wchars - 1] = L'\0';
if (STATUS_SUCCESS != status)
return false;
return true;
}
CLIENT_ID GetCurrentClientId() {
return reinterpret_cast<PARTIAL_TEB*>(NtCurrentTeb())->ClientId;
diff --git a/sandbox/win/src/signed_interception.cc b/sandbox/win/src/signed_interception.cc
--- a/sandbox/win/src/signed_interception.cc
+++ b/sandbox/win/src/signed_interception.cc
@@ -67,17 +67,17 @@ TargetNtCreateSection(NtCreateSectionFun
GetNtExports()->QueryObject(file_handle, ObjectNameInformation, path,
path_buffer_size, &out_buffer_size);
if (!NT_SUCCESS(status)) {
break;
}
CountedParameterSet<NameBased> params;
- params[NameBased::NAME] = ParamPickerMake(path->ObjectName.Buffer);
+ params[NameBased::NAME] = ParamPickerMake(path->Name.Buffer);
// Check if this will be sent to the broker.
if (!QueryBroker(IpcTag::NTCREATESECTION, params.GetBase()))
break;
if (!ValidParameter(section_handle, sizeof(HANDLE), WRITE))
break;
diff --git a/sandbox/win/src/win_utils.cc b/sandbox/win/src/win_utils.cc
--- a/sandbox/win/src/win_utils.cc
+++ b/sandbox/win/src/win_utils.cc
@@ -453,30 +453,30 @@ absl::optional<std::wstring> GetNtPathFr
absl::optional<std::wstring> GetPathFromHandle(HANDLE handle) {
auto buffer = QueryObjectInformation(handle, ObjectNameInformation, 512);
if (!buffer)
return absl::nullopt;
OBJECT_NAME_INFORMATION* name =
reinterpret_cast<OBJECT_NAME_INFORMATION*>(buffer->data());
return std::wstring(
- name->ObjectName.Buffer,
- name->ObjectName.Length / sizeof(name->ObjectName.Buffer[0]));
+ name->Name.Buffer,
+ name->Name.Length / sizeof(name->Name.Buffer[0]));
}
absl::optional<std::wstring> GetTypeNameFromHandle(HANDLE handle) {
// No typename is currently longer than 32 characters on Windows 11, so use a
// hint of 128 bytes.
auto buffer = QueryObjectInformation(handle, ObjectTypeInformation, 128);
if (!buffer)
return absl::nullopt;
OBJECT_TYPE_INFORMATION* name =
reinterpret_cast<OBJECT_TYPE_INFORMATION*>(buffer->data());
- return std::wstring(name->Name.Buffer,
- name->Name.Length / sizeof(name->Name.Buffer[0]));
+ return std::wstring(name->TypeName.Buffer,
+ name->TypeName.Length / sizeof(name->TypeName.Buffer[0]));
}
bool CopyToChildMemory(HANDLE child,
const void* local_buffer,
size_t buffer_bytes,
void** remote_buffer) {
DCHECK(remote_buffer);
if (0 == buffer_bytes) {