76 static const wstring dosdevices =
L"\\DosDevices\\";
118 if (
path.Length > 4 *
sizeof(
WCHAR) &&
path.Buffer[0] ==
'\\' &&
path.Buffer[1] ==
'\\' &&
path.Buffer[2] ==
'?' &&
path.Buffer[3] ==
'\\')
119 path.Buffer[1] =
'?';
144 dev.disk_num = 0xffffffff;
145 dev.part_num = 0xffffffff;
151 dev.friendly_name =
L"";
154 dev.has_parts =
false;
156 dev.multi_device =
false;
164 DRIVE_LAYOUT_INFORMATION_EX* dli;
183 if (sdd2->VendorIdOffset != 0) {
184 desc2 += (
char*)((
uint8_t*)sdd2 + sdd2->VendorIdOffset);
186 while (desc2.length() > 0 && desc2[desc2.length() - 1] ==
' ')
187 desc2 = desc2.substr(0, desc2.length() - 1);
190 if (sdd2->ProductIdOffset != 0) {
191 if (sdd2->VendorIdOffset != 0 && desc2.length() != 0 && desc2[desc2.length() - 1] !=
' ')
194 desc2 += (
char*)((
uint8_t*)sdd2 + sdd2->ProductIdOffset);
196 while (desc2.length() > 0 && desc2[desc2.length() - 1] ==
' ')
197 desc2 = desc2.substr(0, desc2.length() - 1);
200 if (sdd2->VendorIdOffset != 0 || sdd2->ProductIdOffset != 0) {
209 dev.friendly_name = desc3;
228 dli = (DRIVE_LAYOUT_INFORMATION_EX*)
malloc(dlisize);
231 nullptr, 0, dli, dlisize);
235 dev.has_parts =
true;
243 for (
const auto&
p :
v) {
244 if (
p.symlink.length() == 14 &&
p.symlink.substr(0, dosdevices.length()) == dosdevices &&
p.symlink[13] ==
':') {
246 for(
auto p =
v.begin();
p !=
v.end(); ++
p) {
247 if ((*p).symlink.length() == 14 && (*p).symlink.substr(0, dosdevices.length()) == dosdevices && (*p).symlink[13] ==
':') {
252 dr[0] =
p.symlink[12];
254 dr[0] = (*p).symlink[12];
267 if (!
dev.is_disk || !
dev.has_parts) {
281 if (
dev.fstype ==
L"Btrfs") {
297 wstring pref =
L"\\Device\\Btrfs{";
#define FILE_GENERIC_READ
static PIO_STATUS_BLOCK iosb
WCHAR DevicePath[ANYSIZE_ARRAY]
GLsizei const GLchar ** path
BOOL WINAPI SetupDiGetDeviceInterfaceDetailW(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, DWORD DeviceInterfaceDetailDataSize, PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData)
#define INVALID_HANDLE_VALUE
DWORD WINAPI GetLastError(VOID)
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
#define STATUS_BUFFER_TOO_SMALL
GLfloat GLfloat GLfloat GLfloat h
struct _SP_DEVICE_INTERFACE_DETAIL_DATA_W SP_DEVICE_INTERFACE_DETAIL_DATA_W
static wstring get_mountdev_name(const nt_handle &h)
#define FILE_SYNCHRONOUS_IO_ALERT
std::vector< mountmgr_point > query_points(const std::wstring_view &symlink=L"", const std::wstring_view &unique_id=L"", const std::wstring_view &device_name=L"") const
#define IOCTL_STORAGE_GET_DEVICE_NUMBER
#define IOCTL_DISK_GET_LENGTH_INFO
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define IOCTL_STORAGE_QUERY_PROPERTY
STORAGE_DEVICE_DESCRIPTOR
#define NT_SUCCESS(StatCode)
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
void push_back(const _Tp &__x=_STLP_DEFAULT_CONSTRUCTED(_Tp))
#define FILE_SHARE_DELETE
#define SetupDiGetClassDevs
STORAGE_QUERY_TYPE QueryType
static const fs_identifier fs_ident[]
#define STATUS_BUFFER_OVERFLOW
#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
BOOL WINAPI SetupDiEnumDeviceInterfaces(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, CONST GUID *InterfaceClassGuid, DWORD MemberIndex, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
STORAGE_PROPERTY_ID PropertyId
#define MultiByteToWideChar
UCHAR AdditionalParameters[1]
#define DIGCF_DEVICEINTERFACE
#define InitializeObjectAttributes(p, n, a, r, s)
#define RtlCopyMemory(Destination, Source, Length)
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define RtlCompareMemory(s1, s2, l)
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key)
GLuint const GLchar * name