summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fs/ntapi_tt_open_volume_by_guid.c65
-rw-r--r--src/internal/ntapi.c1
-rw-r--r--src/internal/ntapi_fnapi.h1
3 files changed, 67 insertions, 0 deletions
diff --git a/src/fs/ntapi_tt_open_volume_by_guid.c b/src/fs/ntapi_tt_open_volume_by_guid.c
new file mode 100644
index 0000000..4f6236c
--- /dev/null
+++ b/src/fs/ntapi_tt_open_volume_by_guid.c
@@ -0,0 +1,65 @@
+/********************************************************/
+/* ntapi: Native API core library */
+/* Copyright (C) 2013--2018 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */
+/********************************************************/
+
+#include <ntapi/ntapi.h>
+#include <ntapi/nt_file.h>
+#include "ntapi_impl.h"
+
+struct __ntapi_volume_name {
+ wchar16_t global[4];
+ wchar16_t volume[6];
+ nt_guid_str_utf16 guid;
+};
+
+int32_t __stdcall __ntapi_tt_open_volume_by_guid(
+ __out void ** hfile,
+ __in const nt_guid * guid,
+ __in uint32_t access,
+ __in nt_object_attributes * oaarg,
+ __out nt_io_status_block * iosb,
+ __in uint32_t share,
+ __in uint32_t options)
+{
+ struct __ntapi_volume_name name;
+ nt_unicode_string path;
+ nt_object_attributes oa;
+
+ if (!oaarg)
+ oaarg = &(nt_object_attributes){sizeof(*oaarg),0,0,0,0,0};
+
+ else if (oaarg->obj_name)
+ return NT_STATUS_INVALID_PARAMETER;
+
+ name.global[0] = '\\';
+ name.global[1] = '?';
+ name.global[2] = '?';
+ name.global[3] = '\\';
+
+ name.volume[0] = 'V';
+ name.volume[1] = 'o';
+ name.volume[2] = 'l';
+ name.volume[3] = 'u';
+ name.volume[4] = 'm';
+ name.volume[5] = 'e';
+
+ __ntapi->tt_guid_to_string_utf16(
+ guid,&name.guid);
+
+ path.strlen = sizeof(name);
+ path.maxlen = 0;
+ path.buffer = &name.global[0];
+
+ oa.len = oaarg->len;
+ oa.root_dir = oaarg->root_dir;
+ oa.obj_name = &path;
+ oa.obj_attr = oaarg->obj_attr;
+ oa.sec_desc = oaarg->sec_desc;
+ oa.sec_qos = oaarg->sec_qos;
+
+ return __ntapi->zw_open_file(
+ hfile,access,&oa,iosb,
+ share,options);
+}
diff --git a/src/internal/ntapi.c b/src/internal/ntapi.c
index f22f2c4..d1540dd 100644
--- a/src/internal/ntapi.c
+++ b/src/internal/ntapi.c
@@ -187,6 +187,7 @@ static int32_t __fastcall __ntapi_init_once(ntapi_vtbl ** pvtbl)
__ntapi->tt_get_file_handle_type = __ntapi_tt_get_file_handle_type;
__ntapi->tt_open_logical_parent_directory = __ntapi_tt_open_logical_parent_directory;
__ntapi->tt_open_physical_parent_directory = __ntapi_tt_open_physical_parent_directory;
+ __ntapi->tt_open_volume_by_guid = __ntapi_tt_open_volume_by_guid;
/* nt_ipc.h */
__ntapi->ipc_connect_by_attr = __ntapi_ipc_connect_by_attr;
diff --git a/src/internal/ntapi_fnapi.h b/src/internal/ntapi_fnapi.h
index 3e309bd..5630fb7 100644
--- a/src/internal/ntapi_fnapi.h
+++ b/src/internal/ntapi_fnapi.h
@@ -47,6 +47,7 @@ ntapi_tt_crc64_table __ntapi_tt_crc64_table;
ntapi_tt_get_file_handle_type __ntapi_tt_get_file_handle_type;
ntapi_tt_open_logical_parent_directory __ntapi_tt_open_logical_parent_directory;
ntapi_tt_open_physical_parent_directory __ntapi_tt_open_physical_parent_directory;
+ntapi_tt_open_volume_by_guid __ntapi_tt_open_volume_by_guid;
/* nt_ipc.h */