SbpStartLanman

NTSTATUS __stdcall SbpStartLanman(){
  VOID **v0; 
  VOID **v1; 
  NTSTATUS DeviceObjectPointer; 
  PFILE_OBJECT v3; 
  int Status; 
  VOID **OutputBuffer; 
  _DEVICE_OBJECT *v6; 
  _IRP *v7; 
  UINT64 v8; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  PDEVICE_OBJECT v10; 
  VOID **PoolWithTag; 
  _DEVICE_OBJECT *v12; 
  _IRP *v13; 
  UINT64 v14; 
  _IO_STACK_LOCATION *v15; 
  PDEVICE_OBJECT v16; 
  UINT64 OutputBufferLength; 
  UINT64 OutputBufferLengtha; 
  __int128 Object; 
  __int64 v21; 
  PDEVICE_OBJECT DeviceObject; 
  PFILE_OBJECT FileObject; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  __int128 InputBuffer[2]; 
  int v26; 
  VOID *ReturnAddress; 

  DeviceObject = 0i64;
  v21 = 0i64;
  v26 = 0;
  Object = 0i64;
  FileObject = 0i64;
  v0 = 0i64;
  IoStatusBlock = 0i64;
  v1 = 0i64;
  memset(InputBuffer, 0, sizeof(InputBuffer));
  DeviceObjectPointer = IoGetDeviceObjectPointer(
                          (_UNICODE_STRING *)&LanmanRedirectorName,
                          0x10000000ui64,
                          &FileObject,
                          &DeviceObject);
  v3 = FileObject;
  Status = DeviceObjectPointer;
  if( DeviceObjectPointer < 0 )
    goto LABEL_12;
  OutputBuffer = ExAllocatePoolWithTag(0x200ui64, 0x8Cui64, 1113746771i64);
  v1 = OutputBuffer;
  if( !OutputBuffer )
    goto LABEL_3;
  *((_DWORD *)OutputBuffer + 15) = -1;
  *((_DWORD *)OutputBuffer + 4) = 5;
  *(_DWORD *)OutputBuffer = 3600;
  *((_DWORD *)OutputBuffer + 2) = 16;
  *((_DWORD *)OutputBuffer + 1) = 250;
  *((_DWORD *)OutputBuffer + 3) = 600;
  *((_DWORD *)OutputBuffer + 5) = 45;
  *((_DWORD *)OutputBuffer + 9) = 10;
  *((_DWORD *)OutputBuffer + 6) = 512;
  *((_DWORD *)OutputBuffer + 7) = 17;
  *((_DWORD *)OutputBuffer + 8) = 6144;
  *((_DWORD *)OutputBuffer + 10) = 500;
  *((_DWORD *)OutputBuffer + 12) = 500;
  *((_DWORD *)OutputBuffer + 11) = 10;
  *((_DWORD *)OutputBuffer + 14) = 45;
  *((_DWORD *)OutputBuffer + 18) = 5;
  v6 = DeviceObject;
  *((_DWORD *)OutputBuffer + 13) = 40;
  *((_DWORD *)OutputBuffer + 16) = 3;
  *((_DWORD *)OutputBuffer + 17) = 20;
  *(VOID **)((char *)OutputBuffer + 76) = (VOID *)60;
  *((_DWORD *)OutputBuffer + 21) = 1;
  *((_DWORD *)OutputBuffer + 22) = 1;
  *((_DWORD *)OutputBuffer + 23) = 1;
  *((_DWORD *)OutputBuffer + 24) = 1;
  *((_DWORD *)OutputBuffer + 25) = 1;
  *((_DWORD *)OutputBuffer + 26) = 1;
  *((_DWORD *)OutputBuffer + 27) = 1;
  *((_DWORD *)OutputBuffer + 28) = 1;
  *((_DWORD *)OutputBuffer + 29) = 1;
  *((_DWORD *)OutputBuffer + 30) = 1;
  *((_DWORD *)OutputBuffer + 31) = 1;
  *((_DWORD *)OutputBuffer + 32) = 1;
  *(VOID **)((char *)OutputBuffer + 132) = (VOID *)1;
  v21 = (__int64)&Object + 8;
  *((_QWORD *)&Object + 1) = (char *)&Object + 8;
  LODWORD(OutputBufferLength) = 140;
  LOWORD(Object) = 1;
  BYTE2(Object) = 6;
  DWORD1(Object) = 0;
  v7 = IopBuildDeviceIoControlRequest(
         0x80140191ui64,
         v6,
         InputBuffer,
         0x24ui64,
         OutputBuffer,
         OutputBufferLength,
         0,
         (_KEVENT *)&Object,
         &IoStatusBlock,
         ReturnAddress);
  v8 = (UINT64)v7;
  if( !v7 )
    goto LABEL_3;
  CurrentStackLocation = v7->Tail.CurrentStackLocation;
  v10 = DeviceObject;
  CurrentStackLocation[-1].FileObject = v3;
  CurrentStackLocation[-1].MajorFunction = 13;
  Status = IofCallDriver((UINT64)v10, v8);
  if( Status == 259 )
  {
    KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
    Status = IoStatusBlock.Status;
  }
  if( Status >= 0 )
  {
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x76ui64, 1113746771i64);
    v0 = PoolWithTag;
    if( PoolWithTag )
    {
      memset(PoolWithTag, 0i64, 0x76u);
      *((_BYTE *)v0 + 65) |= 1u;
      *((_DWORD *)v0 + 17) = -1;
      v12 = DeviceObject;
      *((_WORD *)v0 + 6) = 94;
      *((_BYTE *)v0 + 84) = 1;
      *((_DWORD *)v0 + 19) = 30;
      *((_WORD *)v0 + 43) = 26;
      *((_DWORD *)v0 + 20) = 30;
      *((_DWORD *)v0 + 8) = 20;
      *((_DWORD *)v0 + 10) = 20;
      *((_DWORD *)v0 + 6) = 30;
      *((_BYTE *)v0 + 64) = 31;
      *((_DWORD *)v0 + 18) = 10;
      *((_DWORD *)v0 + 5) = 120;
      *((_DWORD *)v0 + 7) = 0x8000;
      *((_DWORD *)v0 + 9) = 5;
      *((_DWORD *)v0 + 11) = 2048;
      *((_DWORD *)v0 + 12) = 32;
      *((_DWORD *)v0 + 13) = 512;
      *((_DWORD *)v0 + 14) = 0x1000000;
      *((_DWORD *)v0 + 15) = 0x100000;
      *(_OWORD *)(v0 + 11) = *(_OWORD *)L"\\Device\\vmsmb";
      v0[13] = *(VOID **)L"vmsmb";
      *((_WORD *)v0 + 56) = aDeviceVmsmb[12];
      v21 = (__int64)&Object + 8;
      *((_QWORD *)&Object + 1) = (char *)&Object + 8;
      LODWORD(OutputBufferLengtha) = 0;
      LOWORD(Object) = 1;
      BYTE2(Object) = 6;
      DWORD1(Object) = 0;
      v13 = IopBuildDeviceIoControlRequest(
              0x1403A0ui64,
              v12,
              v0,
              0x76ui64,
              0i64,
              OutputBufferLengtha,
              0,
              (_KEVENT *)&Object,
              &IoStatusBlock,
              ReturnAddress);
      v14 = (UINT64)v13;
      if( v13 )
      {
        v15 = v13->Tail.CurrentStackLocation;
        v16 = DeviceObject;
        v15[-1].FileObject = v3;
        v15[-1].MajorFunction = 13;
        Status = IofCallDriver((UINT64)v16, v14);
        if( Status == 259 )
        {
          KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
          Status = IoStatusBlock.Status;
        }
        goto LABEL_12;
      }
    }
LABEL_3:
    Status = -1073741670;
  }
LABEL_12:
  if( v3 )
    ObfDereferenceObjectWithTag(v3, 0x746C6644ui64);
  if( v1 )
    ExFreeHeapPool(v1);
  if( v0 )
    ExFreeHeapPool(v0);
  return Status;
}

Referenced by:

IopInitializeBootDrivers