IopInvalidateVolumesForDevice
INT64 __stdcall IopInvalidateVolumesForDevice(PDEVICE_OBJECT DeviceObject){
PDEVICE_OBJECT v1;
INT64 result;
PDEVICE_OBJECT i;
_ETHREAD *CurrentThread;
BOOL v5;
_ETHREAD *v6;
int v7;
_LIST_ENTRY *v8;
UINT64 v9;
UINT8 v10;
UINT8 v11;
int v12;
_LIST_ENTRY *j;
_LIST_ENTRY *k;
PIRP v15;
int Status;
IRP *ObjectType;
NTSTATUS v18;
PADAPTER_OBJECT DmaAdapter;
struct _IO_STATUS_BLOCK IoStatusBlock;
struct _KEVENT Event;
void *InputBuffer;
PDEVICE_OBJECT v24;
v1 = DeviceObject;
result = 0i64;
memset(&Event, 0, sizeof(Event));
InputBuffer = 0i64;
IoStatusBlock = 0i64;
for( i = DeviceObject; ; i = (PDEVICE_OBJECT)*((_QWORD *)i + 3) )
{
v24 = i;
if( !i )
break;
if( *((_QWORD *)i + 7) )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
KeWaitForSingleObject((char *)i + 280, Executive, 0, 0, 0i64);
InputBuffer = 0i64;
DmaAdapter = (PADAPTER_OBJECT)IoCreateStreamFileObjectLite(0i64, i);
*(_QWORD *)&DmaAdapter[1].Version = *((_QWORD *)i + 7);
v18 = ObOpenObjectByPointer(DmaAdapter, 0x200u, 0i64, 0, (POBJECT_TYPE)IoFileObjectType, 0, &InputBuffer);
if( v18 >= 0 )
{
v6 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v6 + 242);
LOBYTE(v5) = 1;
ExAcquireResourceSharedLite(&IopDatabaseResource, v5);
v7 = *((_DWORD *)v1 + 18);
if( v7 == 7 || v7 == 36 )
{
v8 = &IopDiskFileSystemQueueHead;
}
else
{
v8 = (_LIST_ENTRY *)IopCdRomFileSystemQueueHead;
if( v7 != 2 )
v8 = &IopTapeFileSystemQueueHead;
}
KeInitializeEvent(&Event, NotificationEvent, 0);
v12 = 0;
for( j = v8->Flink; j != v8 && j->Flink != v8; j = j->Flink )
{
for( k = j - 5; k[1].Blink; k = k[1].Blink )
;
KeResetEvent(&Event, v9, v10, v11, ObjectType);
v15 = IoBuildDeviceIoControlRequest(
0x90054u,
(PDEVICE_OBJECT)k,
&InputBuffer,
8u,
0i64,
0,
0,
&Event,
&IoStatusBlock);
if( !v15 )
{
v12 = -1073741670;
break;
}
*(_WORD *)(*((_QWORD *)v15 + 23) - 72i64) = 13;
Status = IofCallDriver((PDEVICE_OBJECT)k, v15);
if( Status == 259 )
{
KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
else
{
IoStatusBlock.Status = Status;
IoStatusBlock.Information = 0i64;
}
if( Status == -1073741808 || Status == -1073741822 )
Status = 0;
if( v12 >= 0 && Status < 0 )
v12 = Status;
}
ExReleaseResourceLite(&IopDatabaseResource);
KeLeaveCriticalRegionThread((__int64)v6);
if( DmaAdapter )
{
HalPutDmaAdapter(DmaAdapter);
if( InputBuffer )
ZwClose(InputBuffer);
}
v18 = v12;
}
KeSetEvent((PRKEVENT)((char *)i + 280), 0);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
result = (unsigned int)v18;
v1 = DeviceObject;
}
}
return result;
}Referenced by:
IopRemoveDevice
PiIrpQueryRemoveDevice