PiProcessQueryAndCancelRemoval
INT64 __fastcall PiProcessQueryAndCancelRemoval(
INT64 a1,
INT64 a2,
UINT64 **a3,
UINT64 a4,
VOID **a5,
INT64 *a6,
const VOID **a7){
unsigned int v9;
CHAR v10;
unsigned int v11;
CHAR *v12;
_UNICODE_STRING *v13;
int RemovalInKernelMode;
__int64 v16;
char *v17;
__int64 v18;
__int64 v19;
CHAR *CriticalMemory;
CHAR v21;
int v22[3];
unsigned int v23;
v23 = a4;
v9 = a1;
v22[0] = 0;
v10 = PiEventAreDeviceRelationsExcluded(a1);
v12 = (CHAR *)v11;
v21 = v10;
v13 = (_UNICODE_STRING *)(a6 + 1);
RemovalInKernelMode = PnpNotifyUserModeDeviceRemoval(
a2,
*a7,
(__int128 *)&GUID_TARGET_DEVICE_QUERY_REMOVE,
(__int64)a6,
(__int64)(a6 + 1),
v22);
if( RemovalInKernelMode < 0 )
{
PnpFinalizeVetoedRemove((_PNP_DEVICE_EVENT_ENTRY *)a2, *(_PNP_VETO_TYPE *)a6, v13);
if( !v22[0] )
return(unsigned int)RemovalInKernelMode;
v16 = (unsigned int)v22[0];
v17 = (char *)*a7;
do
{
v18 = -1i64;
do
++v18;
while( *(_WORD *)&v17[2 * v18] );
v17 += 2 * v18 + 2;
--v16;
}
while( v16 );
v19 = (v17 - (_BYTE *)*a7) >> 1;
CriticalMemory = PnpAllocateCriticalMemory(v9, PagedPool, 2i64 * (unsigned int)(v19 + 1), 0x4B706E50ui64);
v12 = CriticalMemory;
if( !CriticalMemory )
return(unsigned int)-1073741670;
memmove((UINT8 *)CriticalMemory, (UINT8 *)*a7, 2i64 * (unsigned int)v19);
*(_WORD *)&v12[2 * (unsigned int)(v19 + 1) - 2] = 0;
PnpNotifyUserModeDeviceRemoval(a2, v12, (__int128 *)GUID_TARGET_DEVICE_REMOVE_CANCELLED, 0i64, 0i64, 0i64);
goto LABEL_15;
}
RemovalInKernelMode = PipProcessQueryRemovalInKernelMode(v9, a2, (INT64)a3, v23, a5, (INT64)a6);
if( RemovalInKernelMode < 0 )
{
PnpFinalizeVetoedRemove((_PNP_DEVICE_EVENT_ENTRY *)a2, *(_PNP_VETO_TYPE *)a6, v13);
PnpNotifyUserModeDeviceRemoval(a2, *a7, (__int128 *)GUID_TARGET_DEVICE_REMOVE_CANCELLED, 0i64, 0i64, 0i64);
return(unsigned int)RemovalInKernelMode;
}
if( *(_DWORD *)(a2 + 16) == 54 )
{
RemovalInKernelMode = PnpCancelRemoveOnHungDevices(a2, v9, v21, a3, (CHAR **)a7);
LABEL_15:
if( v12 )
ExFreePoolWithTag(v12, 0x4B706E50u);
}
return(unsigned int)RemovalInKernelMode;
}Referenced by:
PnpProcessQueryRemoveAndEject