summaryrefslogtreecommitdiffhomepage
path: root/src/fs
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs')
-rw-r--r--src/fs/ntapi_tt_open_volume_by_guid.c65
1 files changed, 65 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);
+}