summaryrefslogtreecommitdiffhomepage
path: root/src/fs/ntapi_tt_open_volume_by_guid.c
blob: 71d909e42a4435e3bd984e7178a13e276009829c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/********************************************************/
/*  ntapi: Native API core library                      */
/*  Copyright (C) 2013--2021  SysDeer Technologies, LLC */
/*  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);
}