#ifndef _NT_MOUNT_H_
#define _NT_MOUNT_H_
#include "nt_abi.h"
#include "nt_ioctl.h"
#include "nt_statfs.h"
/* hash mark */
/* {'\\','D','e','v','i','c','e','\\'} */
#define __DEVICE_PATH_PREFIX_LEN (8 * sizeof(wchar16_t))
#define __DEVICE_PATH_PREFIX_HASH (0xDA6FA40B)
/* {'\\','D','e','v','i','c','e','\\','M','u','p','\\'} */
#define __DEVICE_MUP_PREFIX_LEN (12 * sizeof(wchar16_t))
#define __DEVICE_MUP_PREFIX_HASH (0x0CEBB5F6)
/* {'\\','?','?','\\','V','o','l','u','m','e','{'} */
#define __VOLUME_PATH_PREFIX_LEN (11 * sizeof(wchar16_t))
#define __VOLUME_PATH_PREFIX_HASH (0xFEBA8529)
/* {'\\','D','o','s','D','e','v','i','c','e','s'} */
#define __DOS_DEVICES_PREFIX_LEN (11 * sizeof(wchar16_t))
#define __DOS_DEVICES_PREFIX_HASH (0x565D0514)
typedef enum _nt_mount_moint_type {
NT_MOUNT_POINT_NONE,
NT_MOUNT_POINT_DEVICE,
NT_MOUNT_POINT_VOLUME,
NT_MOUNT_POINT_DIRECTORY
} nt_mount_moint_type;
/* reparse tag values */
#define NT_IO_REPARSE_TAG_RESERVED_ZERO (0x00000000)
#define NT_IO_REPARSE_TAG_RESERVED_ONE (0x00000001)
#define NT_IO_REPARSE_TAG_MOUNT_POINT (0xA0000003)
#define NT_IO_REPARSE_TAG_HSM (0xC0000004)
#define NT_IO_REPARSE_TAG_HSM2 (0x80000006)
#define NT_IO_REPARSE_TAG_DRIVER_EXTENDER (0x80000005)
#define NT_IO_REPARSE_TAG_SIS (0x80000007)
#define NT_IO_REPARSE_TAG_DFS (0x8000000A)
#define NT_IO_REPARSE_TAG_DFSR (0x80000012)
#define NT_IO_REPARSE_TAG_FILTER_MANAGER (0x8000000B)
#define NT_IO_REPARSE_TAG_SYMLINK (0xA000000C)
typedef struct _nt_mount_dev_name {
uint16_t name_length;
wchar16_t name[];
} nt_mount_dev_name;
typedef struct _nt_mount_mgr_mount_point {
uint32_t symlink_name_offset;
uint16_t symlink_name_length;
uint32_t unique_id_offset;
uint16_t unique_id_length;
uint32_t device_name_offset;
uint16_t device_name_length;
} nt_mount_mgr_mount_point, nt_mount_point;
typedef struct _nt_mount_mgr_mount_point_param {
uint32_t symlink_name_offset;
uint16_t symlink_name_length;
uint32_t unique_id_offset;
uint16_t unique_id_length;
uint32_t device_name_offset;
uint16_t device_name_length;
uint16_t mount_points_offset;
wchar16_t device_name[];
} nt_mount_mgr_mount_point_param, nt_mount_point_param;
typedef struct _nt_mount_mgr_mount_points {
uint32_t size;
uint32_t number;
nt_mount_mgr_mount_point mount_points[];
} nt_mount_mgr_mount_points, nt_mount_points;
typedef struct _nt_mount_point_reparse_buffer {
uint32_t reparse_tag;
uint16_t reparse_data_length;
uint16_t reserved;
uint16_t substitute_name_offset;
uint16_t substitute_name_length;
uint16_t print_name_offset;
uint16_t print_name_length;
uintptr_t path_buffer[];
} nt_mount_point_reparse_buffer, nt_mprb;
typedef struct _nt_dos_devices_name {
wchar16_t dos_devices_prefix[11];
wchar16_t slash;
wchar16_t letter;
wchar16_t colon;
} nt_dos_devices_name;
typedef int32_t __stdcall ntapi_tt_get_dos_drive_device_handle(
__out void ** hdevice,
__in wchar16_t drive_letter);
typedef int32_t __stdcall ntapi_tt_get_dos_drive_root_handle(
__out void ** hroot,
__in wchar16_t drive_letter);
typedef int32_t __stdcall ntapi_tt_get_dos_drive_device_name(
__in void * hdevice __optional,
__in wchar16_t drive_letter __optional,
__out nt_mount_dev_name * buffer,
__in uint32_t buffer_size);
typedef int32_t __stdcall ntapi_tt_get_dos_drive_mount_points(
__in void * hdevice __optional,
__in wchar16_t drive_letter __optional,
__in nt_mount_dev_name * dev_name __optional,
__out void * buffer,
__in uint32_t buffer_size);
typedef int32_t __stdcall ntapi_tt_dev_mount_points_to_statfs(
__in nt_mount_points * mount_points,
__in_out nt_statfs * statfs);
typedef int32_t __stdcall ntapi_tt_get_dos_drive_letter_from_device(
__in void * hdevice __optional,
__out wchar16_t * drive_letter,
__in nt_mount_dev_name * dev_name __optional,
__out void * buffer,
__in uint32_t buffer_size);
#endif