win-pvdrivers

changeset 157:58d13f9f8ef3 0.6.1.0

Fixed xenvbd under x64
author James Harper <james.harper@bendigoit.com.au>
date Sat Jan 26 22:00:23 2008 +1100 (2008-01-26)
parents 9a1f4acc38fb
children b822b4f07ed7
files xenaddresource/xenaddresource.c xenenum/sources xenhide/xenhide.inx xenpci/evtchn.c xenpci/hypercall_amd64.h xenpci/sources xenpci/xenbus.c xenvbd/sources xenvbd/xenvbd.c xenvbd/xenvbd.inx
line diff
     1.1 --- a/xenaddresource/xenaddresource.c	Fri Jan 25 13:36:43 2008 +1100
     1.2 +++ b/xenaddresource/xenaddresource.c	Sat Jan 26 22:00:23 2008 +1100
     1.3 @@ -165,61 +165,3 @@ XenAddResource_PreprocessWdmIrpPNP(WDFDE
     1.4  
     1.5    return Status;
     1.6  }
     1.7 -
     1.8 -/*
     1.9 -static NTSTATUS
    1.10 -XenAddResource_EvtDeviceFilterAddResourceRequirements(WDFDEVICE Device, WDFIORESREQLIST IoResourceRequirementsList)
    1.11 -{
    1.12 -  NTSTATUS Status = STATUS_SUCCESS;
    1.13 -  WDFIORESLIST resourceList;
    1.14 -  IO_RESOURCE_DESCRIPTOR descriptor;
    1.15 -
    1.16 -  UNREFERENCED_PARAMETER(Device);
    1.17 -
    1.18 -  KdPrint((__DRIVER_NAME " --> DeviceResourceRequirementsQuery\n"));
    1.19 -
    1.20 -  Status = WdfIoResourceListCreate(IoResourceRequirementsList, WDF_NO_OBJECT_ATTRIBUTES, &resourceList);
    1.21 -  if (!NT_SUCCESS(Status))
    1.22 -    return Status;
    1.23 -
    1.24 -  RtlZeroMemory(&descriptor, sizeof(descriptor));
    1.25 -
    1.26 -  descriptor.Type = CmResourceTypeMemory;
    1.27 -  descriptor.ShareDisposition = CmResourceShareDeviceExclusive;
    1.28 -  descriptor.Flags = CM_RESOURCE_MEMORY_READ_WRITE;
    1.29 -  descriptor.u.Memory.Length = 0; //PAGE_SIZE;
    1.30 -  descriptor.u.Memory.Alignment = PAGE_SIZE;
    1.31 -  descriptor.u.Memory.MinimumAddress.QuadPart = 0x0000000000000000;
    1.32 -  descriptor.u.Memory.MaximumAddress.QuadPart = 0xFFFFFFFFFFFFFFFF;
    1.33 -
    1.34 -  KdPrint((__DRIVER_NAME "     MinimumAddress = %08x, MaximumAddress = %08x\n", descriptor.u.Memory.MinimumAddress.LowPart, descriptor.u.Memory.MaximumAddress.LowPart));
    1.35 -
    1.36 -  Status = WdfIoResourceListAppendDescriptor(resourceList, &descriptor);
    1.37 -  if (!NT_SUCCESS(Status))
    1.38 -    return Status;
    1.39 -
    1.40 -  RtlZeroMemory(&descriptor, sizeof(descriptor));
    1.41 -
    1.42 -  descriptor.Type = CmResourceTypeInterrupt;
    1.43 -  descriptor.ShareDisposition = CmResourceShareDeviceExclusive;
    1.44 -  descriptor.Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;
    1.45 -  descriptor.u.Interrupt.MinimumVector = 16;
    1.46 -  descriptor.u.Interrupt.MaximumVector = 46;
    1.47 -
    1.48 -  KdPrint((__DRIVER_NAME "     MinimumVector = %d, MaximumVector = %d\n", descriptor.u.Interrupt.MinimumVector, descriptor.u.Interrupt.MaximumVector));
    1.49 -
    1.50 -  Status = WdfIoResourceListAppendDescriptor(resourceList, &descriptor);
    1.51 -  if (!NT_SUCCESS(Status))
    1.52 -    return Status;
    1.53 -
    1.54 -  Status = WdfIoResourceRequirementsListAppendIoResList(IoResourceRequirementsList, resourceList);
    1.55 -  if (!NT_SUCCESS(Status))
    1.56 -  {
    1.57 -    return Status;
    1.58 -  }
    1.59 -
    1.60 -  KdPrint((__DRIVER_NAME " <-- DeviceFilterAddResourceRequirements\n"));
    1.61 -
    1.62 -  return Status;
    1.63 -}
    1.64 -*/
     2.1 --- a/xenenum/sources	Fri Jan 25 13:36:43 2008 +1100
     2.2 +++ b/xenenum/sources	Sat Jan 26 22:00:23 2008 +1100
     2.3 @@ -1,7 +1,7 @@
     2.4  TARGETNAME=xenenum
     2.5  TARGETTYPE=DRIVER
     2.6  TARGETPATH=..\Target\$(DDK_TARGET_OS)
     2.7 -VERSION=0.6.0.0
     2.8 +VERSION=0.6.0.1
     2.9  KMDF_VERSION=1
    2.10  MSC_WARNING_LEVEL=/W4
    2.11  INF_NAME=xenenum
     3.1 --- a/xenhide/xenhide.inx	Fri Jan 25 13:36:43 2008 +1100
     3.2 +++ b/xenhide/xenhide.inx	Sat Jan 26 22:00:23 2008 +1100
     3.3 @@ -13,14 +13,16 @@ DefaultDestDir = 12
     3.4  CoInstaller_CopyFiles = 11
     3.5  
     3.6  [Manufacturer]
     3.7 -%JAMESHARPER%=JAMESHARPER,NT$ARCH$
     3.8 +%JAMESHARPER%=JAMESHARPER,NTx86
     3.9 +%JAMESHARPER%=JAMESHARPER,NTamd64
    3.10  
    3.11 -; For Win2K
    3.12  [JAMESHARPER]
    3.13  %XenHide.DRVDESC%=XenHide_Inst, *PNP0A03
    3.14  
    3.15 -; For XP and later
    3.16 -[JAMESHARPER.NT$ARCH$]
    3.17 +[JAMESHARPER.NTx86]
    3.18 +%XenHide.DRVDESC%=XenHide_Inst, *PNP0A03
    3.19 +
    3.20 +[JAMESHARPER.NTamd64]
    3.21  %XenHide.DRVDESC%=XenHide_Inst, *PNP0A03
    3.22  
    3.23  [XenHide_Inst.NT]
    3.24 @@ -45,9 +47,12 @@ xenhide.sys
    3.25  xenhide.sys=1
    3.26  WdfCoinstaller01005.dll=1,,
    3.27  
    3.28 -[SourceDisksNames]
    3.29 +[SourceDisksNames.x86]
    3.30  1 = %DISK_NAME%,,,\i386
    3.31  
    3.32 +[SourceDisksNames.amd64]
    3.33 +1 = %DISK_NAME%,,,\amd64
    3.34 +
    3.35  [XenHide_Inst.NT.Services]
    3.36  AddService=XenHide,,XenHide_Service_Inst
    3.37  Include=Machine.inf
     4.1 --- a/xenpci/evtchn.c	Fri Jan 25 13:36:43 2008 +1100
     4.2 +++ b/xenpci/evtchn.c	Sat Jan 26 22:00:23 2008 +1100
     4.3 @@ -61,7 +61,7 @@ EvtChn_Interrupt(WDFINTERRUPT Interrupt,
     4.4  
     4.5    vcpu_info->evtchn_upcall_pending = 0;
     4.6  
     4.7 -  evt_words = xchg((volatile xen_long_t *)&vcpu_info->evtchn_pending_sel, 0);
     4.8 +  evt_words = (xen_ulong_t)xchg((volatile xen_long_t *)&vcpu_info->evtchn_pending_sel, 0);
     4.9    
    4.10    while (bit_scan_forward(&evt_word, evt_words))
    4.11    {
     5.1 --- a/xenpci/hypercall_amd64.h	Fri Jan 25 13:36:43 2008 +1100
     5.2 +++ b/xenpci/hypercall_amd64.h	Sat Jan 26 22:00:23 2008 +1100
     5.3 @@ -25,19 +25,6 @@ HYPERVISOR_memory_op(WDFDEVICE Device, i
     5.4    PCHAR memory_op_func = GetDeviceData(Device)->hypercall_stubs;
     5.5    memory_op_func += __HYPERVISOR_memory_op * 32;
     5.6    return _hypercall2(memory_op_func, cmd, arg);
     5.7 -  
     5.8 -/*
     5.9 -  long __res;
    5.10 -  __asm {
    5.11 -    mov ebx, cmd
    5.12 -    mov ecx, arg
    5.13 -    mov eax, hypercall_stubs
    5.14 -    add eax, (__HYPERVISOR_memory_op * 32)
    5.15 -    call eax
    5.16 -    mov [__res], eax
    5.17 -  }
    5.18 -  return __res;
    5.19 -*/
    5.20  }
    5.21  
    5.22  static __inline int
    5.23 @@ -46,21 +33,9 @@ HYPERVISOR_xen_version(WDFDEVICE Device,
    5.24    PCHAR xen_version_func = GetDeviceData(Device)->hypercall_stubs;
    5.25    xen_version_func += __HYPERVISOR_xen_version * 32;
    5.26    return _hypercall2(xen_version_func, cmd, arg);
    5.27 -/*
    5.28 -  char *hypercall_stubs = GetDeviceData(Device)->hypercall_stubs;
    5.29 -  long __res;
    5.30 -  __asm {
    5.31 -    mov ebx, cmd
    5.32 -    mov ecx, arg
    5.33 -    mov eax, hypercall_stubs
    5.34 -    add eax, (__HYPERVISOR_xen_version * 32)
    5.35 -    call eax
    5.36 -    mov [__res], eax
    5.37 -  }
    5.38 -  return __res;
    5.39 -*/
    5.40  }
    5.41  
    5.42 +#if 0
    5.43  static __inline int
    5.44  HYPERVISOR_grant_table_op(WDFDEVICE Device, int cmd, void *uop, unsigned int count)
    5.45  {
    5.46 @@ -125,6 +100,7 @@ HYPERVISOR_console_io(WDFDEVICE Device, 
    5.47  */
    5.48    return -1;
    5.49  }
    5.50 +#endif
    5.51  
    5.52  static __inline int
    5.53  HYPERVISOR_hvm_op(WDFDEVICE Device, int op, struct xen_hvm_param *arg)
    5.54 @@ -132,19 +108,6 @@ HYPERVISOR_hvm_op(WDFDEVICE Device, int 
    5.55    PCHAR hvm_op_func = GetDeviceData(Device)->hypercall_stubs;
    5.56    hvm_op_func += __HYPERVISOR_hvm_op * 32;
    5.57    return _hypercall2(hvm_op_func, op, arg);
    5.58 -/*
    5.59 -  char *hypercall_stubs = GetDeviceData(Device)->hypercall_stubs;
    5.60 -  long __res;
    5.61 -  __asm {
    5.62 -    mov ebx, op
    5.63 -    mov ecx, arg
    5.64 -    mov eax, hypercall_stubs
    5.65 -    add eax, (__HYPERVISOR_hvm_op * 32)
    5.66 -    call eax
    5.67 -    mov [__res], eax
    5.68 -  }
    5.69 -  return __res;
    5.70 -*/
    5.71  }
    5.72  
    5.73  static __inline int
    5.74 @@ -153,19 +116,6 @@ HYPERVISOR_event_channel_op(WDFDEVICE De
    5.75    PCHAR event_channel_op_func = GetDeviceData(Device)->hypercall_stubs;
    5.76    event_channel_op_func += __HYPERVISOR_event_channel_op * 32;
    5.77    return _hypercall2(event_channel_op_func, cmd, op);
    5.78 -/*
    5.79 -  char *hypercall_stubs = GetDeviceData(Device)->hypercall_stubs;
    5.80 -  long __res;
    5.81 -  __asm {
    5.82 -    mov ebx, cmd
    5.83 -    mov ecx, op
    5.84 -    mov eax, hypercall_stubs
    5.85 -    add eax, (__HYPERVISOR_event_channel_op * 32)
    5.86 -    call eax
    5.87 -    mov [__res], eax
    5.88 -  }
    5.89 -  return __res;
    5.90 -*/
    5.91  }
    5.92  
    5.93  static __inline ULONGLONG
     6.1 --- a/xenpci/sources	Fri Jan 25 13:36:43 2008 +1100
     6.2 +++ b/xenpci/sources	Sat Jan 26 22:00:23 2008 +1100
     6.3 @@ -1,7 +1,7 @@
     6.4  TARGETNAME=XENPCI
     6.5  TARGETTYPE=DRIVER
     6.6  TARGETPATH=..\Target\$(DDK_TARGET_OS)
     6.7 -VERSION=0.6.0.21
     6.8 +VERSION=0.6.0.26
     6.9  KMDF_VERSION=1
    6.10  MSC_WARNING_LEVEL=/W4
    6.11  INF_NAME=xenpci
     7.1 --- a/xenpci/xenbus.c	Fri Jan 25 13:36:43 2008 +1100
     7.2 +++ b/xenpci/xenbus.c	Sat Jan 26 22:00:23 2008 +1100
     7.3 @@ -89,6 +89,7 @@ static void release_xenbus_id(WDFDEVICE 
     7.4  //    spin_unlock(&req_lock);
     7.5  }
     7.6  
     7.7 +// This routine free's the rep structure if there was an error!!!
     7.8  static char *errmsg(struct xsd_sockmsg *rep)
     7.9  {
    7.10    char *res;
    7.11 @@ -628,13 +629,13 @@ XenBus_AddWatch(
    7.12    rep = xenbus_msg_reply(Device, XS_WATCH, xbt, req, ARRAY_SIZE(req));
    7.13  
    7.14    msg = errmsg(rep);
    7.15 -  ExFreePoolWithTag(rep, XENPCI_POOL_TAG);
    7.16    if (msg)
    7.17    {
    7.18      xpdd->XenBus_WatchEntries[i].Active = 0;
    7.19      KdPrint((__DRIVER_NAME " <-- XenBus_AddWatch (%s)\n", msg));
    7.20      return msg;
    7.21    }
    7.22 +  ExFreePoolWithTag(rep, XENPCI_POOL_TAG);
    7.23  
    7.24    KdPrint((__DRIVER_NAME " <-- XenBus_AddWatch\n"));
    7.25  
    7.26 @@ -713,8 +714,6 @@ XenBus_RemWatch(
    7.27      return msg;
    7.28    }
    7.29  
    7.30 -  ASSERT(rep != NULL);
    7.31 -
    7.32    ExFreePoolWithTag(rep, XENPCI_POOL_TAG);
    7.33  
    7.34    KdPrint((__DRIVER_NAME " <-- " __FUNCTION__ "\n"));
     8.1 --- a/xenvbd/sources	Fri Jan 25 13:36:43 2008 +1100
     8.2 +++ b/xenvbd/sources	Sat Jan 26 22:00:23 2008 +1100
     8.3 @@ -1,7 +1,7 @@
     8.4  TARGETNAME=XENVBD
     8.5  TARGETTYPE=DRIVER
     8.6  TARGETPATH=..\Target\$(DDK_TARGET_OS)
     8.7 -VERSION=0.6.0.11
     8.8 +VERSION=0.6.0.36
     8.9  KMDF_VERSION=1
    8.10  MSC_WARNING_LEVEL=/W4
    8.11  INF_NAME=xenvbd
     9.1 --- a/xenvbd/xenvbd.c	Fri Jan 25 13:36:43 2008 +1100
     9.2 +++ b/xenvbd/xenvbd.c	Sat Jan 26 22:00:23 2008 +1100
     9.3 @@ -56,7 +56,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
     9.4    HwInitializationData.HwFindAdapter = XenVbd_HwScsiFindAdapter;
     9.5    HwInitializationData.HwResetBus = XenVbd_HwScsiResetBus;
     9.6    HwInitializationData.HwDmaStarted = NULL;
     9.7 -  HwInitializationData.HwAdapterState = NULL;
     9.8 +  HwInitializationData.HwAdapterState = XenVbd_HwScsiAdapterState;
     9.9    HwInitializationData.DeviceExtensionSize = sizeof(XENVBD_DEVICE_DATA);
    9.10    HwInitializationData.SpecificLuExtensionSize = 0;
    9.11    HwInitializationData.SrbExtensionSize = 0;
    9.12 @@ -65,7 +65,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
    9.13    HwInitializationData.NeedPhysicalAddresses = FALSE;
    9.14    HwInitializationData.TaggedQueuing = TRUE;
    9.15    HwInitializationData.AutoRequestSense = FALSE;
    9.16 -  HwInitializationData.MultipleRequestPerLu = FALSE;
    9.17 +  HwInitializationData.MultipleRequestPerLu = TRUE;
    9.18    HwInitializationData.ReceiveEvent = FALSE;
    9.19    HwInitializationData.VendorIdLength = 0;
    9.20    HwInitializationData.VendorId = NULL;
    9.21 @@ -110,11 +110,11 @@ XenVbd_Interrupt(PKINTERRUPT Interrupt, 
    9.22  
    9.23    UNREFERENCED_PARAMETER(Interrupt);
    9.24  
    9.25 -  KdPrint((__DRIVER_NAME " --> Interrupt\n"));
    9.26 +//  KdPrint((__DRIVER_NAME " --> Interrupt\n"));
    9.27  
    9.28    TargetData->PendingInterrupt = TRUE;
    9.29  
    9.30 -  KdPrint((__DRIVER_NAME " <-- Interrupt\n"));
    9.31 +//  KdPrint((__DRIVER_NAME " <-- Interrupt\n"));
    9.32  
    9.33    return TRUE;
    9.34  }
    9.35 @@ -190,7 +190,7 @@ XenVbd_HwScsiInterrupt(PVOID DeviceExten
    9.36    PXENVBD_TARGET_DATA TargetData;
    9.37    int i, j;
    9.38  
    9.39 -  KdPrint((__DRIVER_NAME " --> HwScsiInterrupt\n"));
    9.40 +//  KdPrint((__DRIVER_NAME " --> HwScsiInterrupt\n"));
    9.41  
    9.42    DeviceData = (PXENVBD_DEVICE_DATA)DeviceExtension;
    9.43  
    9.44 @@ -205,7 +205,7 @@ XenVbd_HwScsiInterrupt(PVOID DeviceExten
    9.45        TargetData->PendingInterrupt = FALSE;
    9.46      }
    9.47    }
    9.48 -  KdPrint((__DRIVER_NAME " <-- HwScsiInterrupt\n"));
    9.49 +//  KdPrint((__DRIVER_NAME " <-- HwScsiInterrupt\n"));
    9.50  
    9.51    return TRUE;
    9.52  }
    9.53 @@ -412,7 +412,7 @@ XenVbd_WatchHandler(char *Path, PVOID De
    9.54    KIRQL OldIrql;
    9.55    int i;
    9.56  
    9.57 -  KdPrint((__DRIVER_NAME " --> WatchHandler (DeviceData = %08x)\n", DeviceData));
    9.58 +  KdPrint((__DRIVER_NAME " --> WatchHandler (DeviceData = %p)\n", DeviceData));
    9.59    KdPrint((__DRIVER_NAME "     IRQL = %d\n", KeGetCurrentIrql()));
    9.60  
    9.61    KdPrint((__DRIVER_NAME "     Path = %s\n", Path));
    9.62 @@ -516,10 +516,9 @@ XenVbd_HwScsiFindAdapter(PVOID DeviceExt
    9.63    KdPrint((__DRIVER_NAME " --> " __FUNCTION__ "\n"));  
    9.64    KdPrint((__DRIVER_NAME "     IRQL = %d\n", KeGetCurrentIrql()));
    9.65  
    9.66 -//#if 0
    9.67    // testing this for dump mode
    9.68 -  if (KeGetCurrentIrql() > ConfigInfo->BusInterruptLevel)
    9.69 -    ConfigInfo->BusInterruptLevel = KeGetCurrentIrql();
    9.70 +//  if (KeGetCurrentIrql() > ConfigInfo->BusInterruptLevel)
    9.71 +//    ConfigInfo->BusInterruptLevel = KeGetCurrentIrql();
    9.72  
    9.73    KdPrint((__DRIVER_NAME "     BusInterruptLevel = %d\n", ConfigInfo->BusInterruptLevel));
    9.74    KdPrint((__DRIVER_NAME "     BusInterruptVector = %d\n", ConfigInfo->BusInterruptVector));
    9.75 @@ -546,19 +545,21 @@ XenVbd_HwScsiFindAdapter(PVOID DeviceExt
    9.76        break;
    9.77      }
    9.78    }
    9.79 -
    9.80 +  ConfigInfo->Master = TRUE; // Won't work under x64 without this...
    9.81    ConfigInfo->MaximumTransferLength = BUF_PAGES_PER_SRB * PAGE_SIZE;
    9.82 -KdPrint((__DRIVER_NAME "     NumberOfPhysicalBreaks = %d\n", ConfigInfo->NumberOfPhysicalBreaks));
    9.83 -  ConfigInfo->NumberOfPhysicalBreaks = 2; //BUF_PAGES_PER_SRB - 1; //11 - 1;
    9.84 +  ConfigInfo->NumberOfPhysicalBreaks = BUF_PAGES_PER_SRB - 1;
    9.85    ConfigInfo->ScatterGather = TRUE;
    9.86 -  ConfigInfo->Master = FALSE;
    9.87    ConfigInfo->AlignmentMask = 0;
    9.88    ConfigInfo->NumberOfBuses = SCSI_BUSES;
    9.89 +  for (i = 0; i < ConfigInfo->NumberOfBuses; i++)
    9.90 +  {
    9.91 +    ConfigInfo->InitiatorBusId[i] = 7;
    9.92 +  }
    9.93    ConfigInfo->MaximumNumberOfLogicalUnits = 1;
    9.94 -  ConfigInfo->MaximumNumberOfTargets = SCSI_TARGETS_PER_BUS * SCSI_BUSES;
    9.95 -  //ConfigInfo->TaggedQueueing = TRUE;
    9.96 -
    9.97 -
    9.98 +  ConfigInfo->MaximumNumberOfTargets = SCSI_TARGETS_PER_BUS;
    9.99 +//  ConfigInfo->TaggedQueueing = TRUE;
   9.100 +  if (ConfigInfo->Dma64BitAddresses == SCSI_DMA64_SYSTEM_SUPPORTED)
   9.101 +    ConfigInfo->Dma64BitAddresses = SCSI_DMA64_MINIPORT_SUPPORTED;
   9.102    // This all has to be initialized here as the real Initialize routine
   9.103    // is called at DIRQL, and the XenBus stuff has to be called at
   9.104    // <= DISPATCH_LEVEL
   9.105 @@ -598,8 +599,6 @@ KdPrint((__DRIVER_NAME "     NumberOfPhy
   9.106      //ScsiPortNotification(BusChangeDetected, DeviceData, 0);
   9.107    }
   9.108  
   9.109 -//#endif
   9.110 -
   9.111    *Again = FALSE;
   9.112  
   9.113    KdPrint((__DRIVER_NAME " <-- " __FUNCTION__ "\n"));  
    10.1 --- a/xenvbd/xenvbd.inx	Fri Jan 25 13:36:43 2008 +1100
    10.2 +++ b/xenvbd/xenvbd.inx	Sat Jan 26 22:00:23 2008 +1100
    10.3 @@ -3,7 +3,6 @@ Signature="$WINDOWS NT$"
    10.4  Class=SCSIAdapter
    10.5  ClassGuid={4D36E97B-E325-11CE-BFC1-08002BE10318}
    10.6  Provider=%XenGplPv%
    10.7 -DriverVer=12/10/2007,0.4.0.1
    10.8  
    10.9  [DestinationDirs]
   10.10  DefaultDestDir = 12
   10.11 @@ -31,8 +30,8 @@ xenvbd.sys
   10.12  xenaddresource.sys
   10.13  
   10.14  [XenVbd_Inst.NT.Services]
   10.15 -AddService=XenVbd,2,XenVbd_Service 
   10.16 -AddService=XenAddResource,,XenAddResource_Service 
   10.17 +AddService=XenVbd,2,XenVbd_Service, XenVbd_EventLog
   10.18 +AddService=XenAddResource,,XenAddResource_Service
   10.19  
   10.20  [XenVbd_Service]
   10.21  DisplayName    = %XenVbd.SVCDESC%                            
   10.22 @@ -46,6 +45,13 @@ AddReg = XenVbd_Service_AddReg
   10.23  [XenVbd_Service_AddReg]
   10.24  HKR,"Parameters\PnpInterface", "0", 0x00010001, 0x00000001
   10.25  
   10.26 +[XenVbd_EventLog]
   10.27 +AddReg = XenVbd_EventLog_AddReg
   10.28 +
   10.29 +[XenVbd_EventLog_AddReg]
   10.30 +HKR,,EventMessageFile,0x00020000,"%SystemRoot%\System32\IoLogMsg.dll;%SystemRoot%\System32\drivers\XenVbd.sys"
   10.31 +HKR,,TypesSupported,0x00010001,7
   10.32 +
   10.33  [XenVbd_Inst.NT.CoInstallers]
   10.34  AddReg=CoInstaller_AddReg
   10.35  CopyFiles=CoInstaller_CopyFiles