PiSwIrpStartCreateWorker
NTSTATUS __stdcall PiSwIrpStartCreateWorker(_SW_DEVICE_CREATE_IOCTL_DATA *IoctlData, _IRP *Irp){
_IO_STACK_LOCATION *CurrentStackLocation;
_DEVICE_OBJECT *v4;
char v5;
int Data;
_PI_SWD_OBJECT **inserted;
__int64 v9;
INT64 v10;
_PI_SWD_OBJECT *v11;
__int64 v12;
VOID *v14;
_PI_SWD_OBJECT *v15;
_PI_SWD_OBJECT v16;
__int64 v17;
char v18;
__int64 v19;
UINT64 v20;
_PI_SWD_OBJECT *v21;
void *v22;
int v23;
_DEVICE_OBJECT *v24;
_PI_SWD_OBJECT *v25;
_ADAPTER_OBJECT *v26;
INT64 v27;
INT64 v28;
int v29;
_PI_SWD_OBJECT *v30;
void *v31;
__int64 v32;
VOID *v33;
INT64 v34;
_PI_SWD_OBJECT *SwDeviceObject;
__int64 v36;
__int64 pcbLength[2];
UINT8 NewElement;
_PI_SWD_OBJECT v39;
_PI_SWD_OBJECT *Buffer;
CurrentStackLocation = 0i64;
SwDeviceObject = 0i64;
Buffer = 0i64;
v4 = 0i64;
NewElement = 0;
v5 = 0;
pcbLength[0] = 0i64;
Data = PiSwValidateCreateData(IoctlData);
if( Data < 0 )
goto LABEL_27;
PiSwLock();
if( !Irp )
goto LABEL_91;
CurrentStackLocation = Irp->Tail.CurrentStackLocation;
if( CurrentStackLocation->FileObject->FsContext2 )
Data = -1073741637;
if( Data >= 0 )
{
LABEL_91:
Data = PiSwDeviceCreate(&SwDeviceObject);
if( Data >= 0 )
{
Data = PiSwInstanceInfoInit((WCHAR **)SwDeviceObject + 1, IoctlData);
if( Data >= 0 )
{
inserted = (_PI_SWD_OBJECT **)RtlInsertElementGenericTableAvl(
&PiSwDeviceInstanceTable,
&SwDeviceObject,
8ui64,
&NewElement);
if( !inserted )
{
Data = -1073741670;
LABEL_24:
if( Data >= 0 )
goto LABEL_25;
goto LABEL_41;
}
v11 = *inserted;
Buffer = v11;
if( NewElement )
{
SwDeviceObject = 0i64;
_InterlockedIncrement(v11);
Data = PiSwPnPInfoInit((WCHAR **)Buffer + 3, IoctlData);
if( Data < 0 )
goto LABEL_41;
Buffer[40] = IoctlData[22];
if( *((_QWORD *)IoctlData + 12) )
{
*((_QWORD *)Buffer + 19) = PiSwAllocMem((unsigned int)IoctlData[22]);
v14 = (VOID *)*((_QWORD *)Buffer + 19);
if( !v14 )
{
Data = -1073741670;
goto LABEL_41;
}
memmove(v14, *((const VOID **)IoctlData + 12), IoctlData[22]);
}
Data = PnpCopyDevPropertyArray(
(unsigned int)IoctlData[26],
*((_QWORD *)IoctlData + 14),
v12,
Buffer + 44,
(__int64)(Buffer + 42));
if( Data < 0 || (Data = PiSwBusRelationAdd(*((WCHAR **)IoctlData + 1), Buffer), Data < 0) )
{
LABEL_41:
if( NewElement )
{
RtlDeleteElementGenericTableAvl(&PiSwDeviceInstanceTable, &Buffer);
PiSwDeviceDereference(Buffer);
if( *((_QWORD *)Buffer + 14) )
PiSwBusRelationRemove(Buffer);
}
goto LABEL_25;
}
LABEL_14:
v4 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(*((_QWORD *)Buffer + 14), 0x746C6644u);
LABEL_15:
v5 = 1;
LABEL_16:
if( Irp )
{
if( v5 )
{
_InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, (__int64)PiSwIrpCancelStartCreate);
if( Irp->Cancel )
{
Data = -1073741536;
goto LABEL_41;
}
*((_QWORD *)Buffer + 18) = Irp;
Irp->Tail.CurrentStackLocation->Control |= 1u;
}
else
{
Data = RtlStringCbCopyW(
(WCHAR *)Irp->AssociatedIrp.MasterIrp,
LODWORD(CurrentStackLocation->Parameters.SecurityContext),
*((WCHAR **)Buffer + 10));
if( Data < 0 )
goto LABEL_41;
Data = RtlStringCbLengthW(
(WCHAR *)Irp->AssociatedIrp.MasterIrp,
LODWORD(CurrentStackLocation->Parameters.SecurityContext),
(UINT64 *)pcbLength);
if( Data < 0 )
goto LABEL_41;
}
}
Buffer[1] |= 1u;
if( Irp )
{
CurrentStackLocation->FileObject->FsContext2 = Buffer;
Buffer = 0i64;
}
if( v4 )
IoInvalidateDeviceRelations(v4, SingleBusRelations);
goto LABEL_24;
}
_InterlockedIncrement(v11);
v15 = Buffer;
v16 = Buffer[1];
if( (v16 & 1) != 0 )
{
Data = -1073741771;
goto LABEL_25;
}
if( (v16 & 2) == 0 )
{
v17 = *((_QWORD *)Buffer + 15);
if( v17 )
{
if( (*(_DWORD *)(*(_QWORD *)(v17 + 64) + 8i64) & 2) == 0 )
{
PiSwDoesCreateChangesRequireReEnum(Buffer, IoctlData);
if( !v18 )
{
v19 = *((_QWORD *)IoctlData + 14);
v20 = (unsigned int)IoctlData[26];
v39 = 0;
v36 = 0i64;
Data = PnpCopyDevPropertyArray(v20, v19, v9, &v39, (__int64)&v36);
if( Data < 0 )
goto LABEL_25;
v21 = Buffer;
v22 = (void *)*((_QWORD *)Buffer + 21);
if( v22 )
{
PnpFreeDevPropertyArray(Buffer[44], v22, 0x57706E50u);
v21 = Buffer;
}
v21[44] = v39;
*((_QWORD *)Buffer + 21) = v36;
goto LABEL_16;
}
v15 = Buffer;
}
if( *((_QWORD *)v15 + 11) )
{
PiSwQueuedCreateInfoFree(*((_PI_SWD_QUEUED_CREATE_INFO **)v15 + 11));
*((_QWORD *)Buffer + 11) = 0i64;
v15 = Buffer;
}
PiSwQueuedCreateInfoCreate((_PI_SWD_QUEUED_CREATE_INFO **)v15 + 11, IoctlData, v9, v10);
Data = v23;
if( v23 < 0 )
goto LABEL_25;
Buffer[1] |= 2u;
goto LABEL_14;
}
}
v24 = (_DEVICE_OBJECT *)PnpDeviceObjectFromDeviceInstanceWithTag(*((_QWORD *)Buffer + 14), 0x746C6644u);
v25 = Buffer;
v4 = v24;
if( v24 && PiSwFindPdoAssociation((__int64)Buffer, (__int64)v24, 1) )
{
HalPutDmaAdapter(v26);
v4 = 0i64;
PiSwQueuedCreateInfoCreate((_PI_SWD_QUEUED_CREATE_INFO **)Buffer + 11, IoctlData, v27, v28);
Data = v29;
if( v29 < 0 )
goto LABEL_25;
goto LABEL_15;
}
v25[1] &= ~4u;
PiSwBusRelationRemove(Buffer);
PiSwPnPInfoFree(Buffer + 6);
v30 = Buffer;
if( *((_QWORD *)Buffer + 19) )
{
PiSwFreeMem(*((VOID **)Buffer + 19));
*((_QWORD *)Buffer + 19) = 0i64;
Buffer[40] = 0;
v30 = Buffer;
}
v31 = (void *)*((_QWORD *)v30 + 21);
if( v31 )
{
PnpFreeDevPropertyArray(v30[44], v31, 0x57706E50u);
Buffer[44] = 0;
*((_QWORD *)Buffer + 21) = 0i64;
v30 = Buffer;
}
PiSwFreeInterfaceList((_LIST_ENTRY *)(v30 + 46));
Data = PiSwPnPInfoInit((WCHAR **)Buffer + 3, IoctlData);
if( Data < 0 )
goto LABEL_25;
Buffer[40] = IoctlData[22];
if( *((_QWORD *)IoctlData + 12) )
{
*((_QWORD *)Buffer + 19) = PiSwAllocMem((unsigned int)IoctlData[22]);
v33 = (VOID *)*((_QWORD *)Buffer + 19);
if( !v33 )
{
Data = -1073741670;
goto LABEL_25;
}
memmove(v33, *((const VOID **)IoctlData + 12), IoctlData[22]);
}
Data = PnpCopyDevPropertyArray(
(unsigned int)IoctlData[26],
*((_QWORD *)IoctlData + 14),
v32,
Buffer + 44,
(__int64)(Buffer + 42));
if( Data >= 0 )
{
Data = PiSwBusRelationAdd(*((WCHAR **)IoctlData + 1), Buffer);
if( Data >= 0 )
{
Buffer[1] &= ~2u;
goto LABEL_15;
}
}
}
}
}
LABEL_25:
PiSwUnlock();
if( Data >= 0 && !v5 )
{
v34 = *((_QWORD *)IoctlData + 14);
if( v34 )
{
Data = PiSwPropertySet(
(WCHAR *)Irp->AssociatedIrp.MasterIrp,
(VOID *)1,
v34,
(_DEVPROPERTY *)(unsigned int)IoctlData[26]);
if( Data == -1073741772 )
Data = 0;
}
}
LABEL_27:
if( Irp )
{
if( Data < 0 )
{
Irp->IoStatus.Information = 0i64;
}
else
{
if( v5 )
{
Data = 259;
goto LABEL_31;
}
Irp->IoStatus.Information = pcbLength[0] + 2;
}
Irp->IoStatus.Status = Data;
IofCompleteRequest(Irp, 0);
}
else if( Data >= 0 )
{
Buffer[45] = 1;
PiSwIrpCleanup(Buffer);
}
LABEL_31:
if( Buffer )
PiSwDeviceDereference(Buffer);
if( SwDeviceObject )
PiSwDeviceDereference(SwDeviceObject);
if( v4 )
HalPutDmaAdapter((PADAPTER_OBJECT)v4);
return Data;
}Referenced by:
PiSwIrpStartCreate
PiSwStartCreate