@@ -385,18 +385,32 @@ NTSTATUS LanmanRedirectorStartInstance(
385385
386386int 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