IopCreateArcNamesCd
NTSTATUS __stdcall IopCreateArcNamesCd(_LOADER_PARAMETER_BLOCK *LoaderBlock){
_ARC_DISK_INFORMATION *ArcDiskInformation;
int v2;
unsigned int CdRomCount;
NTSTATUS ConfigurationInformation;
WCHAR *v6;
char v7;
const wchar_t *v8;
_LIST_ENTRY *Flink;
char *ArcBootDeviceName;
char *Blink;
signed __int64 v12;
_LIST_ENTRY *v13;
int v14;
int v15;
VOID **Pool_1;
unsigned int v18;
int v19;
bool v20;
int v21;
__int64 v22;
int DeviceObjectPointer;
_DEVICE_OBJECT *v24;
_IRP *v25;
PIRP *v26;
NTSTATUS Status;
unsigned __int64 v28;
__m128i v29;
__m128i v30;
__m128i v31;
__m128i v32;
int v33;
UINT64 OutputBufferLength;
UINT64 NumberFound;
__int128 NumberFound_8;
__int64 v37;
WCHAR *SymbolicLinkList[3];
PDEVICE_OBJECT DeviceObject;
PFILE_OBJECT FileObject;
_STRING DestinationString;
_IO_STATUS_BLOCK IoStatusBlock;
_GUID InterfaceClassGuid;
_LOADER_PARAMETER_BLOCK *v44;
_UNICODE_STRING SymbolicLinkName;
_STRING v46;
_LARGE_INTEGER Timeout;
int v48;
INT8 pszDest[128];
INT8 SourceString[128];
VOID *ReturnAddress;
ArcDiskInformation = LoaderBlock->ArcDiskInformation;
v44 = LoaderBlock;
v2 = 0;
DestinationString = 0i64;
DeviceObject = 0i64;
FileObject = 0i64;
v46 = 0i64;
v37 = 0i64;
SymbolicLinkName = 0i64;
LODWORD(NumberFound) = 0;
IoStatusBlock = 0i64;
NumberFound_8 = 0i64;
memset(SymbolicLinkList, 0, sizeof(SymbolicLinkList));
CdRomCount = IoGetConfigurationInformation()->CdRomCount;
Timeout.QuadPart = 0i64;
v48 = 0;
InterfaceClassGuid = GUID_DEVINTERFACE_CDROM;
ConfigurationInformation = IopFetchConfigurationInformation(
SymbolicLinkList,
&InterfaceClassGuid,
CdRomCount,
&NumberFound);
v6 = SymbolicLinkList[0];
v7 = 0;
v8 = SymbolicLinkList[0];
if( ConfigurationInformation < 0 )
v7 = 1;
Flink = ArcDiskInformation->DiskSignatures.Flink;
if( (_ARC_DISK_INFORMATION *)ArcDiskInformation->DiskSignatures.Flink == ArcDiskInformation )
goto LABEL_11;
ArcBootDeviceName = LoaderBlock->ArcBootDeviceName;
do
{
Blink = (char *)Flink[1].Blink;
v12 = ArcBootDeviceName - Blink;
SymbolicLinkList[0] = (WCHAR *)Flink;
v13 = Flink;
do
{
v14 = (unsigned __int8)Blink[v12];
v15 = (unsigned __int8)*Blink - v14;
if( v15 )
break;
++Blink;
}
while( v14 );
if( !v15 )
break;
Flink = Flink->Flink;
v13 = 0i64;
SymbolicLinkList[0] = 0i64;
}
while( Flink != (_LIST_ENTRY *)ArcDiskInformation );
if( !v13 )
goto LABEL_11;
Pool_1 = IopVerifierExAllocatePool_1(0x204ui64, 0x800ui64);
if( !Pool_1 )
goto LABEL_11;
v18 = NumberFound;
v19 = 0;
v20 = (unsigned int)NumberFound <= CdRomCount;
LODWORD(NumberFound) = 0;
if( !v20 )
CdRomCount = v18;
if( v7 && !v18 )
CdRomCount += 5;
v21 = 0;
if( !CdRomCount )
goto LABEL_54;
while( 1 )
{
if( v8 && *v8 )
{
RtlInitUnicodeString((PUNICODE_STRING)&SymbolicLinkList[1], v8);
v22 = -1i64;
do
++v22;
while( v8[v22] );
v8 += v22 + 1;
DeviceObjectPointer = IoGetDeviceObjectPointer(
(_UNICODE_STRING *)&SymbolicLinkList[1],
0x80ui64,
&FileObject,
&DeviceObject);
if( DeviceObjectPointer < 0 )
goto LABEL_45;
v24 = DeviceObject;
LODWORD(OutputBufferLength) = 12;
v25 = IopBuildDeviceIoControlRequest(
0x2D1080ui64,
DeviceObject,
0i64,
0i64,
&Timeout,
OutputBufferLength,
0,
(_KEVENT *)&NumberFound_8,
&IoStatusBlock,
ReturnAddress);
if( !v25 )
goto LABEL_57;
LOWORD(NumberFound_8) = 0;
v37 = (__int64)&NumberFound_8 + 8;
BYTE2(NumberFound_8) = 6;
*((_QWORD *)&NumberFound_8 + 1) = (char *)&NumberFound_8 + 8;
DWORD1(NumberFound_8) = 0;
DeviceObjectPointer = IofCallDriver((UINT64)v24, (UINT64)v25);
if( DeviceObjectPointer == 259 )
{
KeWaitForSingleObject((UINT64)&NumberFound_8, 0, 0, 0, 0i64);
DeviceObjectPointer = IoStatusBlock.Status;
}
if( DeviceObjectPointer < 0
|| (RtlStringCchPrintfA(pszDest, 0x80ui64, (INT8 *)"\\Device\\CdRom%d"),
RtlInitAnsiString(&DestinationString, pszDest),
DeviceObjectPointer = RtlAnsiStringToUnicodeString(
(_UNICODE_STRING *)&SymbolicLinkList[1],
&DestinationString,
1u),
DeviceObjectPointer < 0) )
{
LABEL_45:
if( v6 )
ExFreePoolWithTag(v6, 0);
goto LABEL_48;
}
v21 = 0;
}
else
{
RtlStringCchPrintfA(pszDest, 0x80ui64, (INT8 *)"\\Device\\CdRom%d");
LODWORD(NumberFound) = v19 + 1;
RtlInitAnsiString(&DestinationString, pszDest);
if( RtlAnsiStringToUnicodeString((_UNICODE_STRING *)&SymbolicLinkList[1], &DestinationString, 1u) < 0 )
{
LABEL_57:
if( v6 )
ExFreePoolWithTag(v6, 0);
DeviceObjectPointer = -1073741670;
LABEL_48:
ExFreePoolWithTag(Pool_1, 0);
return DeviceObjectPointer;
}
if( IoGetDeviceObjectPointer((_UNICODE_STRING *)&SymbolicLinkList[1], 0x80ui64, &FileObject, &DeviceObject) < 0 )
goto LABEL_53;
v24 = DeviceObject;
}
*(_QWORD *)&InterfaceClassGuid.Data1 = 0x8000i64;
v26 = IoBuildSynchronousFsdRequest(
3u,
v24,
Pool_1,
0x800u,
(PLARGE_INTEGER)&InterfaceClassGuid,
(PKEVENT)&NumberFound_8,
&IoStatusBlock);
if( v26 )
{
LOWORD(NumberFound_8) = 0;
DWORD1(NumberFound_8) = 0;
v37 = (__int64)&NumberFound_8 + 8;
*((_QWORD *)&NumberFound_8 + 1) = (char *)&NumberFound_8 + 8;
BYTE2(NumberFound_8) = 6;
Status = IofCallDriver((UINT64)v24, (UINT64)v26);
if( Status == 259 )
{
KeWaitForSingleObject((UINT64)&NumberFound_8, 0, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( Status >= 0 )
{
v28 = 0i64;
v29 = 0i64;
do
{
v30 = _mm_loadu_si128((const __m128i *)&Pool_1[v28]);
v28 += 2i64;
v31 = _mm_add_epi32(v30, v29);
v29 = v31;
}
while( v28 < 256 );
v32 = _mm_add_epi32(v31, _mm_srli_si128(v31, 8));
v21 = _mm_cvtsi128_si32(_mm_add_epi32(v32, _mm_srli_si128(v32, 4)));
}
}
ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
v33 = v21 + *((_DWORD *)SymbolicLinkList[0] + 8);
v21 = 0;
if( !v33 )
break;
RtlFreeAnsiString((_UNICODE_STRING *)&SymbolicLinkList[1]);
if( ++v2 >= CdRomCount )
goto LABEL_54;
v19 = NumberFound;
}
RtlStringCchPrintfA(SourceString, 0x80ui64, (INT8 *)"\\ArcName\\%s");
RtlInitAnsiString(&v46, SourceString);
DeviceObjectPointer = RtlAnsiStringToUnicodeString(&SymbolicLinkName, &v46, 1u);
if( DeviceObjectPointer < 0 )
{
ExFreePoolWithTag(Pool_1, 0);
if( v6 )
ExFreePoolWithTag(v6, 0);
RtlFreeAnsiString((_UNICODE_STRING *)&SymbolicLinkList[1]);
return DeviceObjectPointer;
}
IoCreateSymbolicLink(&SymbolicLinkName, (_UNICODE_STRING *)&SymbolicLinkList[1]);
RtlFreeAnsiString(&SymbolicLinkName);
LABEL_53:
RtlFreeAnsiString((_UNICODE_STRING *)&SymbolicLinkList[1]);
LABEL_54:
ExFreePoolWithTag(Pool_1, 0);
LABEL_11:
if( v6 )
ExFreePoolWithTag(v6, 0);
return 0;
}Referenced by:
IopCreateArcNames