/********************************************************/
/* 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);
}