IopRegisterDeviceInterface
INT64 __stdcall IopRegisterDeviceInterface(
WCHAR *DeviceInstanceName,
GUID *InterfaceClassGuid,
WCHAR *ReferenceString,
UINT8 UserModeFormat,
WCHAR **SymbolicLinkName,
UINT64 *PdoFlags){
WCHAR **v7;
WCHAR **v8;
WCHAR **v9;
CHAR *v10;
int v11;
int DeviceInterfaceName;
WCHAR *PoolWithTag;
_ETHREAD *CurrentThread;
__int64 v15;
char v16;
int ObjectProperty;
int v18;
ULONG_PTR v19;
char v20;
__int64 v21;
_ETHREAD *v23;
ULONG_PTR v24;
int v25;
unsigned int v26;
WCHAR *v27;
size_t v28;
size_t v29;
char v30;
UINT8 v31;
unsigned int v32;
ULONG_PTR BugCheckParameter2;
PVOID v34;
PVOID v35;
PVOID v36;
int v37;
ULONG v38;
int v39;
HANDLE Handle;
WCHAR *v41;
PVOID P;
GUID Source2;
wchar_t Str2[40];
__int16 v45[40];
v34 = 0i64;
Handle = 0i64;
*SymbolicLinkName = 0i64;
v7 = 0i64;
v35 = 0i64;
v8 = 0i64;
LOBYTE(v37) = 0;
P = 0i64;
v9 = 0i64;
v30 = 0;
BugCheckParameter2 = 0i64;
v36 = 0i64;
v39 = 0;
v38 = 0;
v31 = UserModeFormat;
v41 = ReferenceString;
Source2 = 0i64;
PnpStringFromGuid((int *)InterfaceClassGuid, Str2);
DeviceInterfaceName = v11;
if( v11 < 0 )
goto LABEL_46;
v32 = 512;
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x400ui64, 0x20207050ui64);
*SymbolicLinkName = PoolWithTag;
if( !PoolWithTag )
goto LABEL_45;
LODWORD(v28) = 512;
DeviceInterfaceName = CmGetDeviceInterfaceName(
(__int64)&v32,
Str2,
DeviceInstanceName,
v41,
0,
PoolWithTag,
v28,
&v32);
if( DeviceInterfaceName != -1073741789 )
goto LABEL_4;
ExFreePoolWithTag(*SymbolicLinkName, 0);
v26 = v32;
v27 = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 2i64 * v32, 0x20207050ui64);
*SymbolicLinkName = v27;
if( !v27 )
{
LABEL_45:
DeviceInterfaceName = -1073741670;
goto LABEL_46;
}
LODWORD(v29) = v26;
DeviceInterfaceName = CmGetDeviceInterfaceName((__int64)&v32, Str2, DeviceInstanceName, v41, 0, v27, v29, &v32);
LABEL_4:
if( DeviceInterfaceName < 0 )
goto LABEL_46;
if( PdoFlags )
*(_DWORD *)PdoFlags = PipCheckForDenyExecute(Str2) != 0 ? 0x800000 : 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v15 = -1i64;
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(&PnpRegistryDeviceResource, 1u);
if( (int)PiDmGetObject(3i64, *SymbolicLinkName, (INT64 *)&BugCheckParameter2) >= 0 )
{
v23 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v23 + 242);
v24 = BugCheckParameter2;
ExAcquirePushLockSharedEx(BugCheckParameter2, 0i64);
v25 = *(_DWORD *)(v24 + 32);
ExReleasePushLockEx(v24, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v16 = v25 & 1;
}
else
{
v16 = v37;
}
DeviceInterfaceName = PiDmAddCacheReferenceForObject(4ui64, Str2, (CHAR **)&v36);
if( DeviceInterfaceName < 0 )
goto LABEL_27;
DeviceInterfaceName = PiDmAddCacheReferenceForObject(1ui64, DeviceInstanceName, (CHAR **)&v35);
if( DeviceInterfaceName < 0 )
goto LABEL_27;
ObjectProperty = PnpGetObjectProperty(
PiPnpRtlCtx,
(__int64)DeviceInstanceName,
1i64,
0i64,
0i64,
(__int64)&DEVPKEY_Device_ContainerId,
&v39,
(unsigned __int64)&Source2,
16,
&v38,
0);
DeviceInterfaceName = ObjectProperty;
if( ObjectProperty == -1073741275 )
{
Source2 = 0i64;
}
else if( ObjectProperty < 0 )
{
goto LABEL_27;
}
if( PnpIsNullGuid(&Source2)
|| (PnpStringFromGuid((int *)&Source2, (wchar_t *)v45), DeviceInterfaceName = v18, v18 >= 0)
&& (DeviceInterfaceName = PiDmAddCacheReferenceForObject(5ui64, (WCHAR *)v45, (CHAR **)&v34),
DeviceInterfaceName >= 0) )
{
if( v16
|| (DeviceInterfaceName = PiPnpRtlBeginOperation((__int64 **)&P), DeviceInterfaceName >= 0)
&& (DeviceInterfaceName = CmCreateDeviceInterface(PiPnpRtlCtx, *SymbolicLinkName, 2, &Handle, &v30, 0),
DeviceInterfaceName >= 0) )
{
v19 = BugCheckParameter2;
if( BugCheckParameter2 )
{
LABEL_22:
PiDmListAddObject(0, (UINT64)v36, v19, 0i64);
v20 = v30;
do
++v15;
while( DeviceInstanceName[v15] );
DeviceInterfaceName = PnpSetObjectProperty(
PiPnpRtlCtx,
(__int64)*SymbolicLinkName,
3u,
(__int64)Handle,
0i64,
(__int64)&DEVPKEY_Device_InstanceId,
18,
(__int64)DeviceInstanceName,
2 * (int)v15 + 2,
v30 != 0 ? 0x20000 : 0);
if( DeviceInterfaceName < 0 )
{
if( v20 )
CmDeleteDeviceInterface(PiPnpRtlCtx, *SymbolicLinkName, 0);
}
else
{
PiDmListAddObject(1u, (UINT64)v35, v19, 0i64);
if( v34 )
PiDmListAddObject(2u, (UINT64)v34, v19, 0i64);
}
goto LABEL_27;
}
DeviceInterfaceName = PiDmGetObject(3i64, *SymbolicLinkName, (INT64 *)&BugCheckParameter2);
if( DeviceInterfaceName >= 0 )
{
v19 = BugCheckParameter2;
goto LABEL_22;
}
}
}
LABEL_27:
ExReleaseResourceLite(&PnpRegistryDeviceResource);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( DeviceInterfaceName >= 0 )
{
if( !v31 )
DeviceInterfaceName = CmSetDeviceInterfacePathFormat(v21, *SymbolicLinkName, 1);
v7 = (WCHAR **)v34;
v8 = (WCHAR **)v35;
v9 = (WCHAR **)v36;
goto LABEL_31;
}
v7 = (WCHAR **)v34;
v8 = (WCHAR **)v35;
v9 = (WCHAR **)v36;
LABEL_46:
if( *SymbolicLinkName )
{
ExFreePoolWithTag(*SymbolicLinkName, 0);
*SymbolicLinkName = 0i64;
}
LABEL_31:
if( Handle )
ZwClose(Handle);
if( P )
PiPnpRtlEndOperation(P);
if( BugCheckParameter2 )
PiDmObjectRelease((CHAR *)BugCheckParameter2);
if( v9 )
{
PiDmRemoveCacheReferenceForObject(*((unsigned int *)v9 + 7), v9[2], v10);
PiDmObjectRelease((CHAR *)v9);
}
if( v8 )
{
PiDmRemoveCacheReferenceForObject(*((unsigned int *)v8 + 7), v8[2], v10);
PiDmObjectRelease((CHAR *)v8);
}
if( v7 )
{
PiDmRemoveCacheReferenceForObject(*((unsigned int *)v7 + 7), v7[2], v10);
PiDmObjectRelease((CHAR *)v7);
}
return(unsigned int)DeviceInterfaceName;
}Referenced by:
IoRegisterDeviceInterface
PiCMRegisterDeviceInterface
PiDevCfgConfigureDeviceInterfaces
PiSwIrpInterfaceRegister