RamdiskStart
NTSTATUS __stdcall RamdiskStart(_LOADER_PARAMETER_BLOCK *LoaderBlock){
_LIST_ENTRY *v2;
_LIST_ENTRY *p_MemoryDescriptorListHead;
_LIST_ENTRY *Flink;
NTSTATUS Status;
__int64 v6;
_LIST_ENTRY *v7;
char *LoadOptions;
CHAR v9;
UINT8 *v10;
CHAR v11;
__int64 v12;
unsigned int v13;
UINT8 *v14;
CHAR v15;
__int64 v16;
CHAR v17;
_UNICODE_STRING *v18;
__int64 v19;
UINT64 ShareAccess;
UINT64 OpenOptions;
VOID *FileHandle;
__int128 v24;
_IO_STATUS_BLOCK IoStatusBlock;
_UNICODE_STRING GuidString;
_UNICODE_STRING SymbolicLinkName;
_STRING DestinationString;
_UNICODE_STRING DeviceName;
_OBJECT_ATTRIBUTES ObjectAttributes;
__int64 InputBuffer[8];
INT8 pszDest[32];
WCHAR SourceString[56];
GuidString = 0i64;
v2 = 0i64;
DestinationString = 0i64;
SymbolicLinkName = 0i64;
DeviceName = 0i64;
v24 = 0i64;
memset(InputBuffer, 0i64, sizeof(InputBuffer));
FileHandle = 0i64;
p_MemoryDescriptorListHead = &LoaderBlock->MemoryDescriptorListHead;
Flink = LoaderBlock->MemoryDescriptorListHead.Flink;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
IoStatusBlock = 0i64;
while( Flink != p_MemoryDescriptorListHead )
{
v2 = Flink;
if( LODWORD(Flink[1].Flink) == 25 )
break;
Flink = Flink->Flink;
}
if( Flink == p_MemoryDescriptorListHead )
{
Status = -1073741811;
v6 = 1i64;
goto LABEL_28;
}
InputBuffer[3] = 0i64;
v6 = 3i64;
HIDWORD(InputBuffer[2]) = 3;
*(_DWORD *)((char *)&InputBuffer[7] + 2) = 0;
HIWORD(InputBuffer[7]) = 0;
LODWORD(InputBuffer[0]) = 64;
InputBuffer[6] = (__int64)v2[1].Blink;
LOWORD(InputBuffer[7]) = 0;
InputBuffer[5] = 0i64;
InputBuffer[3] = 2i64;
*(_GUID *)((char *)InputBuffer + 4) = RamdiskBootDiskGuid;
v7 = v2[2].Flink;
LoadOptions = LoaderBlock->LoadOptions;
InputBuffer[4] = (_QWORD)v7 << 12;
if( LoadOptions )
{
strupr(LoadOptions);
strstr((UINT8 *)LoadOptions, (UINT8 *)"RDIMAGEOFFSET", v9);
if( v10 && (strstr(v10, (UINT8 *)"=", v11), v12) )
{
v13 = atol((const CHAR *)(v12 + 1));
LODWORD(InputBuffer[5]) = v13;
}
else
{
v13 = InputBuffer[5];
}
InputBuffer[4] -= v13;
strstr((UINT8 *)LoadOptions, (UINT8 *)"RDIMAGELENGTH", v11);
if( v14 )
{
strstr(v14, (UINT8 *)"=", v15);
if( v16 )
InputBuffer[4] = atoi64((const char *)(v16 + 1));
}
}
LODWORD(v24) = 2097182;
*((_QWORD *)&v24 + 1) = L"\\Device\\Ramdisk";
LODWORD(OpenOptions) = 32;
ObjectAttributes.ObjectName = (_UNICODE_STRING *)&v24;
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 576;
LODWORD(ShareAccess) = 3;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
Status = ZwOpenFile(&FileHandle, 0xC0000000ui64, &ObjectAttributes, &IoStatusBlock, ShareAccess, OpenOptions);
if( Status < 0 || (Status = IoStatusBlock.Status, IoStatusBlock.Status < 0) )
{
v6 = 2i64;
goto LABEL_28;
}
Status = ZwDeviceIoControlFile(
(_HANDLE)FileHandle,
0,
0i64,
0i64,
&IoStatusBlock,
0x240000u,
InputBuffer,
0x40u,
0i64,
0);
ZwClose((_HANDLE)FileHandle);
if( Status < 0 || (Status = IoStatusBlock.Status, IoStatusBlock.Status < 0) )
LABEL_28:
KeBugCheckEx(0xF8u, (PVOID)v6, (PVOID)Status, 0i64, 0i64);
strstr((UINT8 *)LoaderBlock->ArcBootDeviceName, (UINT8 *)"vdisk(", v17);
if( !v19 )
{
Status = RtlStringFromGUID((_GUID *)((char *)InputBuffer + 4), &GuidString, v18);
if( Status < 0 )
{
v6 = 4i64;
goto LABEL_28;
}
RtlStringCbPrintfA(pszDest, 0x14ui64, (INT8 *)"\\ArcName\\%s");
RtlInitAnsiString(&DestinationString, pszDest);
Status = RtlAnsiStringToUnicodeString(&SymbolicLinkName, &DestinationString, 1u);
if( Status < 0 )
{
v6 = 5i64;
goto LABEL_28;
}
RtlStringCbPrintfW(SourceString, 0x6Cui64, (WCHAR *)L"\\Device\\Ramdisk%wZ");
RtlInitUnicodeString(&DeviceName, SourceString);
Status = IoCreateSymbolicLink(&SymbolicLinkName, &DeviceName);
RtlFreeAnsiString(&GuidString);
RtlFreeAnsiString(&SymbolicLinkName);
if( Status < 0 )
{
v6 = 6i64;
goto LABEL_28;
}
}
return 0;
}Referenced by:
IopInitializeBootDrivers