| |
| |
| |
| |
| |
| |
| #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); |
| } |