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