UNICODE_STRING ContainerID;
PULONG Revision;
- PWCHAR *Description;
ULONG Count;
NET_LUID Luid;
static NTSTATUS
PdoAddRevision(
IN PXENVIF_PDO Pdo,
- IN ULONG Revision,
- IN ULONG Vif
+ IN ULONG Revision
)
{
PVOID Buffer;
Pdo->Revision = Buffer;
Pdo->Revision[Pdo->Count] = Revision;
- Buffer = __PdoAllocate(sizeof (PCHAR) * Count);
-
- status = STATUS_NO_MEMORY;
- if (Buffer == NULL)
- goto fail2;
-
- if (Pdo->Description != NULL) {
- RtlCopyMemory(Buffer,
- Pdo->Description,
- sizeof (PWCHAR) * Pdo->Count);
- __PdoFree(Pdo->Description);
- }
-
- Pdo->Description = Buffer;
-
- Buffer = __PdoAllocate(MAXTEXTLEN * Count);
-
- status = STATUS_NO_MEMORY;
- if (Buffer == NULL)
- goto fail3;
-
- status = RtlStringCbPrintfW(Buffer,
- MAXTEXTLEN,
- L"%hs %hs: "
- L"VIF v%u",
- FdoGetName(__PdoGetFdo(Pdo)),
- __PdoGetName(Pdo),
- Vif);
- ASSERT(NT_SUCCESS(status));
-
- Pdo->Description[Pdo->Count] = Buffer;
-
- Trace("%08x -> %ws\n",
- Pdo->Revision[Pdo->Count],
- Pdo->Description[Pdo->Count]);
-
Pdo->Count++;
+ ASSERT3U(Pdo->Count, <=, 64);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
-fail2:
- Error("fail2\n");
-
fail1:
Error("fail1 (%08x)\n", status);
for (Vif = 1; Vif <= XENVIF_VIF_INTERFACE_VERSION_MAX; Vif++) {
Revision++;
- if (Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN &&
- Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN) {
- status = PdoAddRevision(Pdo, Revision,
- Vif);
+ if (Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN &&
+ Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN) {
+ Info("%08X -> "
+ "CACHE v%u "
+ "VIF v%u\n",
+ Revision,
+ Cache,
+ Vif);
+
+ status = PdoAddRevision(Pdo, Revision);
if (!NT_SUCCESS(status))
goto fail1;
}
fail1:
Error("fail1 (%08x)\n", status);
- if (Pdo->Description != NULL) {
- while (--Revision > 0)
- __PdoFree(Pdo->Description[Revision]);
- __PdoFree(Pdo->Description);
- Pdo->Description = NULL;
- }
-
if (Pdo->Revision != NULL) {
__PdoFree(Pdo->Revision);
Pdo->Revision = NULL;
Text.Length = 0;
switch (StackLocation->Parameters.QueryDeviceText.DeviceTextType) {
- case DeviceTextDescription: {
- ULONG Index = Pdo->Count - 1;
-
+ case DeviceTextDescription:
status = RtlStringCbPrintfW(Buffer,
MAXTEXTLEN,
- L"%s",
- Pdo->Description[Index]);
+ L"%hs %hs",
+ FdoGetName(__PdoGetFdo(Pdo)),
+ __PdoGetName(Pdo));
ASSERT(NT_SUCCESS(status));
Buffer += wcslen(Buffer);
break;
- }
+
case DeviceTextLocationInformation:
status = RtlStringCbPrintfW(Buffer,
MAXTEXTLEN,
return STATUS_NOT_SUPPORTED;
}
+#define REGSTR_VAL_MAX_HCID_LEN 1024
+
static DECLSPEC_NOINLINE NTSTATUS
PdoQueryId(
IN PXENVIF_PDO Pdo,
Buffer += wcslen(Buffer);
Buffer++;
+ ASSERT3U((ULONG_PTR)Buffer - (ULONG_PTR)Id.Buffer, <,
+ REGSTR_VAL_MAX_HCID_LEN);
break;
}
default:
PDEVICE_OBJECT PhysicalDeviceObject;
PXENVIF_DX Dx;
PXENVIF_PDO Pdo;
- ULONG Index;
NTSTATUS status;
#pragma prefast(suppress:28197) // Possibly leaking memory 'PhysicalDeviceObject'
if (__PdoIsEjectRequested(Pdo))
goto fail12;
- for (Index = 0; Index < Pdo->Count; Index++) {
- Info("%p (%s %08X)\n",
- PhysicalDeviceObject,
- __PdoGetName(Pdo),
- Pdo->Revision[Index]);
- }
+ Info("%p (%s: Highest Revision = %08X)\n",
+ PhysicalDeviceObject,
+ __PdoGetName(Pdo),
+ Pdo->Revision[Pdo->Count - 1]);
PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
fail8:
Error("fail8\n");
- for (Index = 0; Index < Pdo->Count; Index++)
- __PdoFree(Pdo->Description[Index]);
- __PdoFree(Pdo->Description);
- Pdo->Description = NULL;
-
__PdoFree(Pdo->Revision);
Pdo->Revision = NULL;
Pdo->Count = 0;
PXENVIF_DX Dx = Pdo->Dx;
PDEVICE_OBJECT PhysicalDeviceObject = Dx->DeviceObject;
PXENVIF_FDO Fdo = __PdoGetFdo(Pdo);
- ULONG Index;
ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
BusTeardown(&Pdo->BusInterface);
- for (Index = 0; Index < Pdo->Count; Index++)
- __PdoFree(Pdo->Description[Index]);
- __PdoFree(Pdo->Description);
- Pdo->Description = NULL;
-
__PdoFree(Pdo->Revision);
Pdo->Revision = NULL;
Pdo->Count = 0;