IoRegisterDeviceInterface
NTSTATUS __stdcall IoRegisterDeviceInterface(
_DEVICE_OBJECT *PhysicalDeviceObject,
_GUID *InterfaceClassGuid,
_UNICODE_STRING *ReferenceString,
_UNICODE_STRING *SymbolicLinkName){
WCHAR *v4;
WCHAR *v5;
void *DeviceNode;
WCHAR *v10;
NTSTATUS v11;
int inited;
WCHAR *v13;
int v15;
UINT64 PdoFlags;
WCHAR *SymbolicLinkNamea;
UINT64 ReturnLength;
_GUID *InterfaceClassGuida;
InterfaceClassGuida = InterfaceClassGuid;
LODWORD(ReturnLength) = 0;
v4 = 0i64;
v5 = 0i64;
SymbolicLinkNamea = 0i64;
PdoFlags = 0i64;
*SymbolicLinkName = 0i64;
if( !PhysicalDeviceObject
|| (DeviceNode = PhysicalDeviceObject->DeviceObjectExtension->DeviceNode) == 0i64
|| (*((_DWORD *)DeviceNode + 99) & 0x20000) != 0 )
{
inited = -1073741808;
LABEL_15:
if( v4 )
ExFreePoolWithTag(v4, 0);
goto LABEL_9;
}
if( !*((_QWORD *)DeviceNode + 6) )
goto LABEL_13;
ObQueryNameStringMode(PhysicalDeviceObject, 0i64, 0i64, &ReturnLength, 0);
if( (unsigned int)ReturnLength <= 0x10 )
goto LABEL_13;
if( ReferenceString && ReferenceString->Length >= 2u )
{
v15 = PnpUnicodeStringToWstr((__int16 **)&PdoFlags, 0i64, &ReferenceString->Length);
v5 = (WCHAR *)PdoFlags;
inited = v15;
if( v15 < 0 )
goto LABEL_9;
if( wcspbrk((WCHAR *)PdoFlags, (WCHAR *)L"\\/") )
{
LABEL_13:
inited = -1073741808;
goto LABEL_9;
}
}
v10 = (WCHAR *)*((_QWORD *)DeviceNode + 6);
LODWORD(PdoFlags) = 0;
v11 = IopRegisterDeviceInterface(v10, InterfaceClassGuida, v5, 0, &SymbolicLinkNamea, &PdoFlags);
v4 = SymbolicLinkNamea;
inited = v11;
if( v11 < 0 )
goto LABEL_15;
v13 = SymbolicLinkNamea;
PhysicalDeviceObject->Flags |= PdoFlags;
inited = RtlInitUnicodeStringEx(SymbolicLinkName, v13);
if( inited < 0 )
goto LABEL_15;
LABEL_9:
PnpUnicodeStringToWstrFree(v5, (__int64)ReferenceString);
return inited;
}Referenced by:
PiSwCompleteCreate