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