typedef struct _XENFILT_EMULATED_DEVICE_DATA {
CHAR DeviceID[MAXNAMELEN];
CHAR InstanceID[MAXNAMELEN];
+ CHAR CompatibleID[MAXNAMELEN];
} XENFILT_EMULATED_DEVICE_DATA, *PXENFILT_EMULATED_DEVICE_DATA;
typedef struct _XENFILT_EMULATED_DISK_DATA {
IN PXENFILT_EMULATED_OBJECT EmulatedObject,
IN XENFILT_EMULATED_OBJECT_TYPE Type,
IN PCHAR DeviceID,
- IN PCHAR InstanceID
+ IN PCHAR InstanceID,
+ IN PCHAR CompatibleIDs OPTIONAL
)
{
+ ULONG Index;
+ PCHAR LastMatch;
NTSTATUS status;
status = STATUS_INVALID_PARAMETER;
InstanceID);
ASSERT(NT_SUCCESS(status));
+ if (CompatibleIDs == NULL)
+ goto done;
+
+ Index = 0;
+ LastMatch = CompatibleIDs;
+ for (;;) {
+ ULONG Length;
+
+ Length = (ULONG)strlen(&CompatibleIDs[Index]);
+ if (Length == 0)
+ break;
+
+ LastMatch = &CompatibleIDs[Index];
+
+ Index += Length + 1;
+ }
+
+ status = RtlStringCbPrintfA(EmulatedObject->Data.Device.CompatibleID,
+ MAXNAMELEN,
+ "%s",
+ LastMatch);
+ ASSERT(NT_SUCCESS(status));
+
+done:
return STATUS_SUCCESS;
fail1:
IN PXENFILT_EMULATED_OBJECT EmulatedObject,
IN XENFILT_EMULATED_OBJECT_TYPE Type,
IN PCHAR DeviceID,
- IN PCHAR InstanceID
+ IN PCHAR InstanceID,
+ IN PCHAR CompatibleIDs OPTIONAL
)
{
PCHAR End;
NTSTATUS status;
UNREFERENCED_PARAMETER(DeviceID);
+ UNREFERENCED_PARAMETER(CompatibleIDs);
status = STATUS_INVALID_PARAMETER;
if (Type != XENFILT_EMULATED_OBJECT_TYPE_IDE)
IN PXENFILT_EMULATED_CONTEXT Context,
IN PCHAR DeviceID,
IN PCHAR InstanceID,
+ IN PCHAR CompatibleIDs OPTIONAL,
IN XENFILT_EMULATED_OBJECT_TYPE Type,
OUT PXENFILT_EMULATED_OBJECT *EmulatedObject
)
status = EmulatedSetObjectDeviceData(*EmulatedObject,
Type,
DeviceID,
- InstanceID);
+ InstanceID,
+ CompatibleIDs);
break;
case XENFILT_EMULATED_OBJECT_TYPE_IDE:
status = EmulatedSetObjectDiskData(*EmulatedObject,
Type,
DeviceID,
- InstanceID);
+ InstanceID,
+ CompatibleIDs);
break;
default:
break;
}
+ if (EmulatedObject->Type == XENFILT_EMULATED_OBJECT_TYPE_PCI &&
+ _stricmp("PCI\\CC_0108", EmulatedObject->Data.Device.CompatibleID) == 0 &&
+ Index <= 3) {
+ Trace("FOUND\n");
+ break;
+ }
+
ListEntry = ListEntry->Flink;
}
Dx->InstanceID : "";
}
+static FORCEINLINE XENFILT_EMULATED_OBJECT_TYPE
+__PdoGetType(
+ IN PXENFILT_PDO Pdo
+ )
+{
+ return Pdo->Type;
+}
+
static FORCEINLINE PCHAR
__PdoGetLocationInformation(
IN PXENFILT_PDO Pdo
PDEVICE_OBJECT FilterDeviceObject;
PXENFILT_DX Dx;
PXENFILT_PDO Pdo;
+ PCHAR CompatibleIDs;
NTSTATUS status;
ASSERT(Type != XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN);
if (!NT_SUCCESS(status))
goto fail6;
+ status = DriverQueryId(Pdo->LowerDeviceObject,
+ BusQueryCompatibleIDs,
+ &CompatibleIDs);
+ if (!NT_SUCCESS(status))
+ CompatibleIDs = NULL;
+
status = EmulatedAddObject(DriverGetEmulatedContext(),
__PdoGetDeviceID(Pdo),
__PdoGetInstanceID(Pdo),
- Pdo->Type,
+ CompatibleIDs,
+ __PdoGetType(Pdo),
&Pdo->EmulatedObject);
if (!NT_SUCCESS(status))
goto fail7;
+ if (CompatibleIDs)
+ ExFreePool(CompatibleIDs);
+
__PdoSetName(Pdo);
Info("%p (%s) %s\n",
fail7:
Error("fail7\n");
+ if (CompatibleIDs)
+ ExFreePool(CompatibleIDs);
+
PdoClearDeviceInformation(Pdo);
fail6: