FsRtlGetSectorSizeInformation

NTSTATUS __stdcall FsRtlGetSectorSizeInformation(
        _DEVICE_OBJECT *RealDevice,
        _FILE_FS_SECTOR_SIZE_INFORMATION *SectorSizeInfo){
  NTSTATUS result; 
  NTSTATUS v5; 
  ULONG v6; 
  ULONG v7; 
  ULONG v8; 
  ULONG Flags; 
  int v10; 
  unsigned int v11; 
  ULONG v12; 
  ULONG v13; 
  UINT64 InputBufferLength; 
  UINT64 InputBufferLengtha; 
  UINT64 InputBufferLengthb; 
  UINT64 InputBufferLengthc; 
  UINT64 InputBufferLengthd; 
  UINT64 OutputBufferLength; 
  UINT64 OutputBufferLengtha; 
  UINT64 OutputBufferLengthb; 
  UINT64 OutputBufferLengthc; 
  UINT64 OutputBufferLengthd; 
  UINT64 IosbInformation[2]; 
  __int64 v25[18]; 
  int InputBuffer; 
  __int64 v27; 
  __int64 v28; 
  __int128 v29; 
  unsigned int v30; 
  __int64 v31; 
  int v32; 
  __int64 v33; 
  int v34; 
  __int128 OutputBuffer; 
  __int64 v36; 
  __int128 v37; 

  IosbInformation[0] = 0i64;
  HIDWORD(v27) = 0;
  v30 = 0;
  v36 = 0i64;
  OutputBuffer = 0i64;
  v29 = 0i64;
  memset(v25, 0i64, sizeof(v25));
  LODWORD(OutputBufferLength) = 24;
  *(_OWORD *)&SectorSizeInfo->LogicalBytesPerSector = 0i64;
  *(_QWORD *)&SectorSizeInfo->Flags = 0i64;
  SectorSizeInfo->ByteOffsetForPartitionAlignment = 0;
  LODWORD(InputBufferLength) = 0;
  result = FsRtlIssueDeviceIoControl(
             RealDevice,
             0x70000ui64,
             2u,
             0i64,
             InputBufferLength,
             &OutputBuffer,
             OutputBufferLength,
             0i64);
  if( result >= 0 )
  {
    if( !HIDWORD(v36) || ((HIDWORD(v36) - 1) & HIDWORD(v36)) != 0 )
    {
      return -1073741621;
    }
    else
    {
      v27 = 0i64;
      LODWORD(OutputBufferLengtha) = 28;
      LODWORD(InputBufferLengtha) = 12;
      InputBuffer = 6;
      v30 = 0;
      v28 = 0x100000002i64;
      v29 = 0i64;
      v5 = FsRtlIssueDeviceIoControl(
             RealDevice,
             0x2D1400ui64,
             2u,
             &InputBuffer,
             InputBufferLengtha,
             &v28,
             OutputBufferLengtha,
             IosbInformation);
      v6 = HIDWORD(v36);
      if( v5 < 0
        || IosbInformation[0] < 0x1C
        || (unsigned int)v28 < 0x1C
        || HIDWORD(v28) < IosbInformation[0]
        || !DWORD2(v29)
        || DWORD2(v29) != HIDWORD(v36)
        || (v7 = HIDWORD(v29), HIDWORD(v29) < DWORD2(v29))
        || !HIDWORD(v29)
        || ((HIDWORD(v29) - 1) & HIDWORD(v29)) != 0
        || HIDWORD(v29) % DWORD2(v29)
        || (v8 = v30, v30 % DWORD2(v29)) )
      {
        v7 = HIDWORD(v36);
        v28 = 0i64;
        HIDWORD(v29) = HIDWORD(v36);
        v8 = -1;
        *(_QWORD *)&v29 = 0i64;
        DWORD2(v29) = HIDWORD(v36);
        v30 = -1;
      }
      SectorSizeInfo->LogicalBytesPerSector = HIDWORD(v36);
      SectorSizeInfo->PhysicalBytesPerSectorForAtomicity = v7;
      SectorSizeInfo->PhysicalBytesPerSectorForPerformance = v7;
      SectorSizeInfo->Flags = 3;
      SectorSizeInfo->ByteOffsetForSectorAlignment = v8;
      SectorSizeInfo->ByteOffsetForPartitionAlignment = -1;
      SectorSizeInfo->FileSystemEffectivePhysicalBytesPerSectorForAtomicity = v6;
      if( v8 != -1 )
      {
        SectorSizeInfo->ByteOffsetForSectorAlignment = v8;
        Flags = SectorSizeInfo->Flags;
        LODWORD(OutputBufferLengthb) = 144;
        v10 = v8 % v7;
        if( v8 % v7 )
          Flags = 2;
        SectorSizeInfo->Flags = Flags;
        LODWORD(InputBufferLengthb) = 0;
        if( FsRtlIssueDeviceIoControl(
               RealDevice,
               0x70048ui64,
               2u,
               0i64,
               InputBufferLengthb,
               v25,
               OutputBufferLengthb,
               0i64) >= 0 )
        {
          v11 = HIDWORD(v29);
          v12 = v25[1] % HIDWORD(v29);
          v13 = HIDWORD(v29) - v12;
          SectorSizeInfo->ByteOffsetForPartitionAlignment = v12;
          if( v13 % v11 != v10 )
            SectorSizeInfo->Flags &= ~2u;
        }
      }
      v27 = 0i64;
      v31 = 0i64;
      v32 = 0;
      InputBuffer = 7;
      LODWORD(OutputBufferLengthb) = 12;
      LODWORD(InputBufferLengthb) = 12;
      if( FsRtlIssueDeviceIoControl(
             RealDevice,
             0x2D1400ui64,
             2u,
             &InputBuffer,
             InputBufferLengthb,
             &v31,
             OutputBufferLengthb,
             IosbInformation) >= 0
        && IosbInformation[0] >= 0xC
        && (unsigned int)v31 >= 0xC
        && !(_BYTE)v32
        && HIDWORD(v31) >= IosbInformation[0] )
      {
        SectorSizeInfo->Flags |= 4u;
      }
      v27 = 0i64;
      v33 = 0i64;
      v34 = 0;
      InputBuffer = 8;
      LODWORD(OutputBufferLengthc) = 12;
      LODWORD(InputBufferLengthc) = 12;
      if( FsRtlIssueDeviceIoControl(
             RealDevice,
             0x2D1400ui64,
             2u,
             &InputBuffer,
             InputBufferLengthc,
             &v33,
             OutputBufferLengthc,
             IosbInformation) >= 0
        && IosbInformation[0] >= 0xC
        && (unsigned int)v33 >= 0xC
        && (_BYTE)v34
        && HIDWORD(v33) >= IosbInformation[0] )
      {
        SectorSizeInfo->Flags |= 8u;
      }
      v27 = 0i64;
      LODWORD(OutputBufferLengthd) = 16;
      LODWORD(InputBufferLengthd) = 12;
      InputBuffer = 55;
      v37 = 0i64;
      if( FsRtlIssueDeviceIoControl(
             RealDevice,
             0x2D1400ui64,
             2u,
             &InputBuffer,
             InputBufferLengthd,
             &v37,
             OutputBufferLengthd,
             IosbInformation) >= 0
        && IosbInformation[0] == 16
        && (BYTE8(v37) & 1) != 0 )
      {
        SectorSizeInfo->Flags |= 0x10u;
      }
      return 0;
    }
  }
  return result;
}

Referenced by:

RawQueryVolumeInformation