Skip to content

Commit dfa9ccc

Browse files
committed
Continue to implement VirtualSmb.
1 parent f0455c8 commit dfa9ccc

1 file changed

Lines changed: 119 additions & 11 deletions

File tree

VirtualSmb/VirtualSmb.cpp

Lines changed: 119 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -385,18 +385,32 @@ NTSTATUS LanmanRedirectorStartInstance(
385385

386386
int main()
387387
{
388-
HANDLE LanmanRedirectorHandle = ::CreateFileW(
389-
L"\\\\.\\GLOBALROOT\\Device\\LanmanRedirector",
390-
FILE_LIST_DIRECTORY | FILE_TRAVERSE | SYNCHRONIZE,
391-
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
392-
nullptr,
393-
OPEN_EXISTING,
394-
0,
395-
nullptr);
396-
if (INVALID_HANDLE_VALUE != LanmanRedirectorHandle)
397-
{
398-
NTSTATUS Status = STATUS_SUCCESS;
388+
NTSTATUS Status = STATUS_SUCCESS;
399389

390+
HANDLE LanmanRedirectorHandle = INVALID_HANDLE_VALUE;
391+
{
392+
UNICODE_STRING LanmanRedirectorDevicePath = RTL_CONSTANT_STRING(
393+
L"\\Device\\LanmanRedirector");
394+
OBJECT_ATTRIBUTES ObjectAttributes = {};
395+
ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
396+
ObjectAttributes.ObjectName = &LanmanRedirectorDevicePath;
397+
ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
398+
IO_STATUS_BLOCK IoStatusBlock = {};
399+
Status = ::NtCreateFile(
400+
&LanmanRedirectorHandle,
401+
FILE_LIST_DIRECTORY | FILE_TRAVERSE | SYNCHRONIZE,
402+
&ObjectAttributes,
403+
&IoStatusBlock,
404+
0,
405+
0,
406+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
407+
FILE_OPEN,
408+
0,
409+
nullptr,
410+
0);
411+
}
412+
if (NT_SUCCESS(Status))
413+
{
400414
do
401415
{
402416
// 120: 26100.xxxx 28000
@@ -527,6 +541,100 @@ int main()
527541
::CloseHandle(LanmanRedirectorHandle);
528542
}
529543

544+
HANDLE VmSmbHandle = INVALID_HANDLE_VALUE;
545+
{
546+
UNICODE_STRING VmSmbDevicePath = RTL_CONSTANT_STRING(
547+
L"\\Device\\vmsmb");
548+
OBJECT_ATTRIBUTES ObjectAttributes = {};
549+
ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
550+
ObjectAttributes.ObjectName = &VmSmbDevicePath;
551+
ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
552+
IO_STATUS_BLOCK IoStatusBlock = {};
553+
Status = ::NtCreateFile(
554+
&VmSmbHandle,
555+
FILE_LIST_DIRECTORY | FILE_TRAVERSE | SYNCHRONIZE,
556+
&ObjectAttributes,
557+
&IoStatusBlock,
558+
0,
559+
0,
560+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
561+
FILE_OPEN,
562+
0,
563+
nullptr,
564+
0);
565+
}
566+
if (NT_SUCCESS(Status))
567+
{
568+
const WCHAR DeviceName[] =
569+
L"\\Device\\VMBus\\{4d12e519-17a0-4ae4-8eaa-5270fc6abdb7}-{dcc079ae-60ba-4d07-847c-3493609c0870}-0000";
570+
const std::size_t DeviceNameLength =
571+
(sizeof(DeviceName) / sizeof(WCHAR)) - 1;
572+
573+
const std::size_t RequestBufferSize =
574+
FIELD_OFFSET(LMR_BIND_UNBIND_TRANSPORT_REQUEST, TransportId) +
575+
sizeof(WCHAR) * DeviceNameLength;
576+
UINT8 RequestBuffer[RequestBufferSize] = {};
577+
578+
PLMR_BIND_UNBIND_TRANSPORT_REQUEST Request =
579+
reinterpret_cast<PLMR_BIND_UNBIND_TRANSPORT_REQUEST>(RequestBuffer);
580+
Request->StructureSize = sizeof(LMR_BIND_UNBIND_TRANSPORT_REQUEST);
581+
Request->Flags = 0;
582+
Request->Type = SmbCeTransportTypeVmbus;
583+
Request->TransportIdLength = DeviceNameLength * sizeof(WCHAR);
584+
std::memcpy(
585+
Request->TransportId,
586+
DeviceName,
587+
sizeof(DeviceName) - sizeof(WCHAR));
588+
IO_STATUS_BLOCK IoStatusBlock = {};
589+
Status = ::NtFsControlFile(
590+
VmSmbHandle,
591+
nullptr,
592+
nullptr,
593+
nullptr,
594+
&IoStatusBlock,
595+
FSCTL_LMR_BIND_TO_TRANSPORT,
596+
RequestBuffer,
597+
RequestBufferSize,
598+
nullptr,
599+
0);
600+
if (NT_SUCCESS(Status))
601+
{
602+
std::printf("VMBUS transport bound to SMB redirector instance.\n");
603+
}
604+
else
605+
{
606+
std::printf(
607+
"Failed to bind VMBUS transport to SMB redirector instance: "
608+
"0x%08X\n",
609+
Status);
610+
}
611+
}
612+
613+
{
614+
HANDLE Handle = INVALID_HANDLE_VALUE;
615+
{
616+
UNICODE_STRING VmSmbDevicePath = RTL_CONSTANT_STRING(
617+
L"\\Device\\vmsmb\\VSMB-{dcc079ae-60ba-4d07-847c-3493609c0870}\\NanaBox.HostDrivers");
618+
OBJECT_ATTRIBUTES ObjectAttributes = {};
619+
ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
620+
ObjectAttributes.ObjectName = &VmSmbDevicePath;
621+
ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
622+
IO_STATUS_BLOCK IoStatusBlock = {};
623+
Status = ::NtCreateFile(
624+
&Handle,
625+
FILE_LIST_DIRECTORY | FILE_TRAVERSE | SYNCHRONIZE,
626+
&ObjectAttributes,
627+
&IoStatusBlock,
628+
0,
629+
0,
630+
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
631+
FILE_OPEN,
632+
0,
633+
nullptr,
634+
0);
635+
}
636+
}
637+
530638
std::getchar();
531639

532640
return 0;

0 commit comments

Comments
 (0)