win-pvdrivers

changeset 981:b96f14f62b50

removed old xenconfig code
author James Harper <james.harper@bendigoit.com.au>
date Sun Jun 17 14:57:35 2012 +1000 (2012-06-17)
parents ea3c61839ff5
children e9011a1ba5bb d9da5f8f7431
files xenconfig/xenconfig.c
line diff
     1.1 --- a/xenconfig/xenconfig.c	Sun Apr 15 23:41:21 2012 +1000
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,415 +0,0 @@
     1.4 -/*
     1.5 -PV Drivers for Windows Xen HVM Domains
     1.6 -Copyright (C) 2007 James Harper
     1.7 -
     1.8 -This program is free software; you can redistribute it and/or
     1.9 -modify it under the terms of the GNU General Public License
    1.10 -as published by the Free Software Foundation; either version 2
    1.11 -of the License, or (at your option) any later version.
    1.12 -
    1.13 -This program is distributed in the hope that it will be useful,
    1.14 -but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.15 -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    1.16 -GNU General Public License for more details.
    1.17 -
    1.18 -You should have received a copy of the GNU General Public License
    1.19 -along with this program; if not, write to the Free Software
    1.20 -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    1.21 -*/
    1.22 -
    1.23 -#include "xenconfig.h"
    1.24 -#include <stdlib.h>
    1.25 -
    1.26 -DRIVER_INITIALIZE DriverEntry;
    1.27 -static NTSTATUS
    1.28 -XenConfig_AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject);
    1.29 -static NTSTATUS
    1.30 -XenConfig_Pass(PDEVICE_OBJECT DeviceObject, PIRP Irp);
    1.31 -static NTSTATUS
    1.32 -XenConfig_Pnp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
    1.33 -static NTSTATUS
    1.34 -XenConfig_AddDevice();
    1.35 -//static NTSTATUS
    1.36 -//XenConfig_Unload();
    1.37 -
    1.38 -#ifdef ALLOC_PRAGMA
    1.39 -#pragma alloc_text (INIT, DriverEntry)
    1.40 -#pragma alloc_text (PAGE, XenConfig_AddDevice)
    1.41 -#endif
    1.42 -
    1.43 -static BOOLEAN gplpv;
    1.44 -
    1.45 -static NTSTATUS
    1.46 -XenConfig_Power(PDEVICE_OBJECT device_object, PIRP irp)
    1.47 -{
    1.48 -  NTSTATUS status;
    1.49 -  PXENCONFIG_DEVICE_DATA xcdd = device_object->DeviceExtension;
    1.50 -
    1.51 -  PoStartNextPowerIrp(irp);
    1.52 -  IoSkipCurrentIrpStackLocation(irp);
    1.53 -  status = PoCallDriver(xcdd->lower_do, irp);
    1.54 -  return status;
    1.55 -}
    1.56 -
    1.57 -NTSTATUS
    1.58 -DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
    1.59 -{
    1.60 -  NTSTATUS status = STATUS_SUCCESS;
    1.61 -  int i;
    1.62 -
    1.63 -  UNREFERENCED_PARAMETER(RegistryPath);
    1.64 -
    1.65 -  KdPrint((__DRIVER_NAME " --> DriverEntry\n"));
    1.66 -
    1.67 -  for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
    1.68 -    DriverObject->MajorFunction[i] = XenConfig_Pass;
    1.69 -  DriverObject->MajorFunction[IRP_MJ_PNP] = XenConfig_Pnp;
    1.70 -  DriverObject->MajorFunction[IRP_MJ_POWER] = XenConfig_Power;
    1.71 -  DriverObject->DriverExtension->AddDevice = XenConfig_AddDevice;
    1.72 -
    1.73 -  KdPrint((__DRIVER_NAME " <-- DriverEntry\n"));
    1.74 -
    1.75 -  return status;
    1.76 -}
    1.77 -
    1.78 -static NTSTATUS
    1.79 -XenConfig_AddDevice(
    1.80 -  PDRIVER_OBJECT DriverObject,
    1.81 -  PDEVICE_OBJECT PhysicalDeviceObject
    1.82 -  )
    1.83 -{
    1.84 -  NTSTATUS status;
    1.85 -  PDEVICE_OBJECT device_object = NULL;
    1.86 -  PXENCONFIG_DEVICE_DATA xcdd;
    1.87 -
    1.88 -  KdPrint((__DRIVER_NAME " --> " __FUNCTION__ "\n"));
    1.89 -
    1.90 -  status = IoCreateDevice (DriverObject,
    1.91 -    sizeof(XENCONFIG_DEVICE_DATA),
    1.92 -    NULL,
    1.93 -    FILE_DEVICE_UNKNOWN,
    1.94 -    FILE_DEVICE_SECURE_OPEN,
    1.95 -    FALSE,
    1.96 -    &device_object);
    1.97 -
    1.98 -  xcdd = (PXENCONFIG_DEVICE_DATA)device_object->DeviceExtension;
    1.99 -
   1.100 -  xcdd->pdo = PhysicalDeviceObject;
   1.101 -  xcdd->lower_do = IoAttachDeviceToDeviceStack(
   1.102 -    device_object, PhysicalDeviceObject);
   1.103 -  device_object->Flags |= xcdd->lower_do->Flags;
   1.104 -
   1.105 -  device_object->DeviceType = xcdd->lower_do->DeviceType;
   1.106 -
   1.107 -  device_object->Characteristics = 
   1.108 -    xcdd->lower_do->Characteristics;
   1.109 -
   1.110 -  xcdd->filter_do = device_object;
   1.111 -
   1.112 -  device_object->Flags &= ~DO_DEVICE_INITIALIZING;
   1.113 -
   1.114 -  KdPrint((__DRIVER_NAME " <-- " __FUNCTION__ "\n"));
   1.115 -
   1.116 -  return STATUS_SUCCESS;
   1.117 -}
   1.118 -
   1.119 -static NTSTATUS
   1.120 -XenConfig_Pass(PDEVICE_OBJECT DeviceObject, PIRP Irp)
   1.121 -{
   1.122 -  PXENCONFIG_DEVICE_DATA xcdd = (PXENCONFIG_DEVICE_DATA)DeviceObject->DeviceExtension;
   1.123 -  NTSTATUS status;
   1.124 -    
   1.125 -  IoSkipCurrentIrpStackLocation(Irp);
   1.126 -  status = IoCallDriver(xcdd->lower_do, Irp);
   1.127 -  return status;
   1.128 -}
   1.129 -
   1.130 -static NTSTATUS
   1.131 -XenConfig_Pnp_IoCompletion(PDEVICE_OBJECT device_object, PIRP irp, PVOID context)
   1.132 -{
   1.133 -  PKEVENT event = (PKEVENT)context;
   1.134 -
   1.135 -  UNREFERENCED_PARAMETER(device_object);
   1.136 -
   1.137 -//  KdPrint((__DRIVER_NAME " --> " __FUNCTION__ "\n"));
   1.138 -
   1.139 -  if (irp->PendingReturned)
   1.140 -  {
   1.141 -    KeSetEvent(event, IO_NO_INCREMENT, FALSE);
   1.142 -  }
   1.143 -
   1.144 -//  KdPrint((__DRIVER_NAME " <-- " __FUNCTION__"\n"));
   1.145 -
   1.146 -  return STATUS_MORE_PROCESSING_REQUIRED;
   1.147 -}
   1.148 -
   1.149 -static NTSTATUS
   1.150 -XenConfig_SendAndWaitForIrp(PDEVICE_OBJECT device_object, PIRP irp)
   1.151 -{
   1.152 -  NTSTATUS status;
   1.153 -  PXENCONFIG_DEVICE_DATA xcdd = (PXENCONFIG_DEVICE_DATA)device_object->DeviceExtension;
   1.154 -  KEVENT event;
   1.155 -
   1.156 -  UNREFERENCED_PARAMETER(device_object);
   1.157 -
   1.158 -//  KdPrint((__DRIVER_NAME " --> " __FUNCTION__ "\n"));
   1.159 -
   1.160 -  KeInitializeEvent(&event, NotificationEvent, FALSE);
   1.161 -
   1.162 -  IoCopyCurrentIrpStackLocationToNext(irp);
   1.163 -  IoSetCompletionRoutine(irp, XenConfig_Pnp_IoCompletion, &event, TRUE, TRUE, TRUE);
   1.164 -
   1.165 -  status = IoCallDriver(xcdd->lower_do, irp);
   1.166 -
   1.167 -  if (status == STATUS_PENDING)
   1.168 -  {
   1.169 -//    KdPrint((__DRIVER_NAME "     waiting ...\n"));
   1.170 -    KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
   1.171 -//    KdPrint((__DRIVER_NAME "     ... done\n"));
   1.172 -    status = irp->IoStatus.Status;
   1.173 -  }
   1.174 -
   1.175 -//  KdPrint((__DRIVER_NAME " <-- " __FUNCTION__"\n"));
   1.176 -
   1.177 -  return status;
   1.178 -}
   1.179 -
   1.180 -static VOID
   1.181 -XenConfig_Pnp_StartDeviceCallback(PDEVICE_OBJECT device_object, PVOID context)
   1.182 -{
   1.183 -  NTSTATUS status = STATUS_SUCCESS;
   1.184 -  //PXENCONFIG_DEVICE_DATA xcdd = device_object->DeviceExtension;
   1.185 -  PIRP irp = context;
   1.186 -  
   1.187 -  UNREFERENCED_PARAMETER(device_object);
   1.188 -
   1.189 -  KdPrint((__DRIVER_NAME " --> " __FUNCTION__ "\n"));
   1.190 -  
   1.191 -  irp->IoStatus.Status = status;
   1.192 -  
   1.193 -  IoCompleteRequest(irp, IO_NO_INCREMENT);
   1.194 -
   1.195 -  KdPrint((__DRIVER_NAME " <-- " __FUNCTION__"\n"));
   1.196 -}
   1.197 -
   1.198 -static PMDL
   1.199 -XenConfig_MakeConfigPage(PDEVICE_OBJECT device_object)
   1.200 -{
   1.201 -  NTSTATUS status;
   1.202 -  PXENCONFIG_DEVICE_DATA xcdd = (PXENCONFIG_DEVICE_DATA)device_object->DeviceExtension;
   1.203 -  HANDLE hwkey_handle, xenkey_handle, confkey_handle;
   1.204 -  ULONG length;
   1.205 -  PKEY_BASIC_INFORMATION key_info;
   1.206 -  PKEY_VALUE_PARTIAL_INFORMATION type_info;
   1.207 -  PKEY_VALUE_PARTIAL_INFORMATION value_info;
   1.208 -  UNICODE_STRING xenkey_name, confkey_name;
   1.209 -  UNICODE_STRING type_name, value_name;
   1.210 -  UNICODE_STRING tmp_unicode_string;
   1.211 -  //UNICODE_STRING typekey_value, valuekey_value;
   1.212 -  //UNICODE_STRING value_value;
   1.213 -  OBJECT_ATTRIBUTES oa;
   1.214 -  ULONG info_length = 1000;
   1.215 -  PMDL mdl;
   1.216 -  UCHAR type;
   1.217 -  ANSI_STRING setting;
   1.218 -  ANSI_STRING value;
   1.219 -  PUCHAR ptr;
   1.220 -  int i;
   1.221 -
   1.222 -  mdl = AllocateUncachedPage();
   1.223 -  ptr = MmGetMdlVirtualAddress(mdl);
   1.224 -
   1.225 -  status = IoOpenDeviceRegistryKey(xcdd->pdo, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &hwkey_handle);
   1.226 -
   1.227 -  if (!NT_SUCCESS(status))
   1.228 -  {
   1.229 -    KdPrint((__DRIVER_NAME "    cannot get hardware key\n"));
   1.230 -    ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_END, NULL, NULL);          
   1.231 -    return mdl;
   1.232 -  }
   1.233 -  RtlInitUnicodeString(&xenkey_name, L"XenConfig");
   1.234 -  InitializeObjectAttributes(&oa, &xenkey_name, 0, hwkey_handle, NULL);
   1.235 -  status = ZwOpenKey(&xenkey_handle, KEY_READ, &oa);
   1.236 -  if (!NT_SUCCESS(status))
   1.237 -  {
   1.238 -    // close key_handle
   1.239 -    KdPrint((__DRIVER_NAME "    cannot get XenConfig key\n"));
   1.240 -    ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_END, NULL, NULL);          
   1.241 -    return mdl;
   1.242 -  }
   1.243 -  // XenConfig key exists, so we go ahead and make fake memory resources
   1.244 -  RtlInitUnicodeString(&type_name, L"type");
   1.245 -  RtlInitUnicodeString(&value_name, L"value");
   1.246 -  key_info = ExAllocatePoolWithTag(PagedPool, info_length, XENCONFIG_POOL_TAG);
   1.247 -  type_info = ExAllocatePoolWithTag(PagedPool, info_length, XENCONFIG_POOL_TAG);
   1.248 -  value_info = ExAllocatePoolWithTag(PagedPool, info_length, XENCONFIG_POOL_TAG);
   1.249 -  //value.Buffer = ExAllocatePoolWithTag(PagedPool, info_length, XENCONFIG_POOL_TAG);
   1.250 -  //value.MaximumLength = info_length;
   1.251 -  setting.Buffer = ExAllocatePoolWithTag(PagedPool, info_length, XENCONFIG_POOL_TAG);
   1.252 -  setting.MaximumLength = (USHORT)info_length;
   1.253 -  
   1.254 -  ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_RUN, NULL, NULL);
   1.255 -  for (i = 0; ZwEnumerateKey(xenkey_handle, i, KeyBasicInformation, key_info, info_length, &length) == STATUS_SUCCESS; i++)
   1.256 -  {
   1.257 -    confkey_name.Length = (USHORT)key_info->NameLength;
   1.258 -    confkey_name.MaximumLength = (USHORT)key_info->NameLength;
   1.259 -    confkey_name.Buffer = key_info->Name;
   1.260 -    RtlUnicodeStringToAnsiString(&setting, &confkey_name, FALSE);
   1.261 -    setting.Buffer[setting.Length] = 0;
   1.262 -    KdPrint((__DRIVER_NAME "     config key name = '%wZ'\n", &confkey_name));
   1.263 -    InitializeObjectAttributes(&oa, &confkey_name, 0, xenkey_handle, NULL);
   1.264 -    status = ZwOpenKey(&confkey_handle, KEY_READ, &oa);
   1.265 -    if (!NT_SUCCESS(status))
   1.266 -    {
   1.267 -      KdPrint((__DRIVER_NAME "    cannot get handle for XenConfig\\%wZ\n", &confkey_name));
   1.268 -      continue;
   1.269 -    }
   1.270 -    
   1.271 -    status = ZwQueryValueKey(confkey_handle, &type_name, KeyValuePartialInformation, type_info, info_length, &length);
   1.272 -    // make sure type is dword
   1.273 -    type = (UCHAR)*(ULONG *)type_info->Data;
   1.274 -    status = ZwQueryValueKey(confkey_handle, &value_name, KeyValuePartialInformation, value_info, info_length, &length);
   1.275 -    if (!NT_SUCCESS(status))
   1.276 -    {
   1.277 -      ADD_XEN_INIT_REQ(&ptr, type, setting.Buffer, NULL);
   1.278 -    }
   1.279 -    else
   1.280 -    {
   1.281 -      switch(value_info->Type)
   1.282 -      {
   1.283 -      case REG_DWORD:
   1.284 -        ADD_XEN_INIT_REQ(&ptr, type, setting.Buffer, UlongToPtr(*(PULONG)value_info->Data));
   1.285 -        break;
   1.286 -        
   1.287 -      case REG_SZ:
   1.288 -        tmp_unicode_string.Length = (USHORT)value_info->DataLength;
   1.289 -        tmp_unicode_string.MaximumLength = (USHORT)value_info->DataLength;
   1.290 -        tmp_unicode_string.Buffer = (PWCHAR)value_info->Data;
   1.291 -        RtlUnicodeStringToAnsiString(&value, &tmp_unicode_string, FALSE);
   1.292 -        value.Buffer[value.Length] = 0;
   1.293 -        ADD_XEN_INIT_REQ(&ptr, type, setting.Buffer, value.Buffer);
   1.294 -        break;
   1.295 -      
   1.296 -      default:
   1.297 -        // report error here
   1.298 -        break;
   1.299 -      }
   1.300 -    }
   1.301 -  }
   1.302 -  ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_END, NULL, NULL);          
   1.303 -
   1.304 -  ExFreePoolWithTag(key_info, XENCONFIG_POOL_TAG);
   1.305 -
   1.306 -  return mdl;
   1.307 -}
   1.308 -
   1.309 -static NTSTATUS
   1.310 -XenConfig_QueueWorkItem(PDEVICE_OBJECT device_object, PIO_WORKITEM_ROUTINE routine, PVOID context)
   1.311 -{
   1.312 -  PIO_WORKITEM work_item;
   1.313 -  NTSTATUS status = STATUS_SUCCESS;
   1.314 -
   1.315 -  work_item = IoAllocateWorkItem(device_object);
   1.316 -  IoQueueWorkItem(work_item, routine, DelayedWorkQueue, context);
   1.317 -	
   1.318 -  return status;
   1.319 -}
   1.320 -
   1.321 -static NTSTATUS
   1.322 -XenConfig_Pnp_StartDevice(PDEVICE_OBJECT device_object, PIRP irp)
   1.323 -{
   1.324 -  NTSTATUS status;
   1.325 -  //PXENCONFIG_DEVICE_DATA xcdd = (PXENCONFIG_DEVICE_DATA)device_object->DeviceExtension;
   1.326 -  PIO_STACK_LOCATION stack;
   1.327 -  PMDL mdl;
   1.328 -  PCM_RESOURCE_LIST old_crl, new_crl;
   1.329 -  PCM_PARTIAL_RESOURCE_LIST prl;
   1.330 -  PCM_PARTIAL_RESOURCE_DESCRIPTOR prd;
   1.331 -  ULONG old_length, new_length;
   1.332 -
   1.333 -  UNREFERENCED_PARAMETER(device_object);
   1.334 -
   1.335 -  KdPrint((__DRIVER_NAME " --> " __FUNCTION__ "\n"));
   1.336 -
   1.337 -  stack = IoGetCurrentIrpStackLocation(irp);
   1.338 -
   1.339 -  if ((mdl = XenConfig_MakeConfigPage(device_object)) != NULL)
   1.340 -  {
   1.341 -    old_crl = stack->Parameters.StartDevice.AllocatedResourcesTranslated;
   1.342 -    old_length = FIELD_OFFSET(CM_RESOURCE_LIST, List) + 
   1.343 -      FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList) +
   1.344 -      FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors) +
   1.345 -      sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * old_crl->List[0].PartialResourceList.Count;
   1.346 -    new_length = old_length + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * 1;
   1.347 -    new_crl = ExAllocatePoolWithTag(PagedPool, new_length, XENCONFIG_POOL_TAG);
   1.348 -    memcpy(new_crl, old_crl, old_length);
   1.349 -    prl = &new_crl->List[0].PartialResourceList;
   1.350 -    prd = &prl->PartialDescriptors[prl->Count++];
   1.351 -    prd->Type = CmResourceTypeMemory;
   1.352 -    prd->ShareDisposition = CmResourceShareDeviceExclusive;
   1.353 -    prd->Flags = CM_RESOURCE_MEMORY_READ_WRITE;
   1.354 -    KdPrint((__DRIVER_NAME "     PFN[0] = %p\n", MmGetMdlPfnArray(mdl)[0]));
   1.355 -    prd->u.Memory.Start.QuadPart = ((ULONGLONG)MmGetMdlPfnArray(mdl)[0]) << PAGE_SHIFT;
   1.356 -    prd->u.Memory.Length = PAGE_SIZE;
   1.357 -    KdPrint((__DRIVER_NAME "     Start = %08x:%08x, Length = %d\n", prd->u.Memory.Start.HighPart, prd->u.Memory.Start.LowPart, prd->u.Memory.Length));
   1.358 -    stack->Parameters.StartDevice.AllocatedResourcesTranslated = new_crl;
   1.359 -
   1.360 -    old_crl = stack->Parameters.StartDevice.AllocatedResources;
   1.361 -    new_crl = ExAllocatePoolWithTag(PagedPool, new_length, XENCONFIG_POOL_TAG);
   1.362 -    memcpy(new_crl, old_crl, old_length);
   1.363 -    prl = &new_crl->List[0].PartialResourceList;
   1.364 -    prd = &prl->PartialDescriptors[prl->Count++];
   1.365 -    prd->Type = CmResourceTypeMemory;
   1.366 -    prd->ShareDisposition = CmResourceShareDeviceExclusive;
   1.367 -    prd->Flags = CM_RESOURCE_MEMORY_READ_WRITE;
   1.368 -    prd->u.Memory.Start.QuadPart = (ULONGLONG)MmGetMdlPfnArray(mdl)[0] << PAGE_SHIFT;
   1.369 -    prd->u.Memory.Length = PAGE_SIZE;
   1.370 -    stack->Parameters.StartDevice.AllocatedResources = new_crl;
   1.371 -
   1.372 -    // free the original resource lists???
   1.373 -  }
   1.374 -
   1.375 -  IoMarkIrpPending(irp);
   1.376 -  status = XenConfig_SendAndWaitForIrp(device_object, irp);
   1.377 -
   1.378 -  XenConfig_QueueWorkItem(device_object, XenConfig_Pnp_StartDeviceCallback, irp);
   1.379 -
   1.380 -  KdPrint((__DRIVER_NAME " <-- " __FUNCTION__"\n"));
   1.381 -  
   1.382 -  return STATUS_PENDING;
   1.383 -}
   1.384 -
   1.385 -static NTSTATUS
   1.386 -XenConfig_Pnp(PDEVICE_OBJECT device_object, PIRP irp)
   1.387 -{
   1.388 -  NTSTATUS status = STATUS_SUCCESS;
   1.389 -  PIO_STACK_LOCATION stack;
   1.390 -  PXENCONFIG_DEVICE_DATA xcdd = (PXENCONFIG_DEVICE_DATA)device_object->DeviceExtension;
   1.391 -
   1.392 -//  KdPrint((__DRIVER_NAME " --> " __FUNCTION__ "\n"));
   1.393 -
   1.394 -  stack = IoGetCurrentIrpStackLocation(irp);
   1.395 -
   1.396 -  switch (stack->MinorFunction) {
   1.397 -#if 0
   1.398 -  case IRP_MN_START_DEVICE:
   1.399 -    return XenConfig_Pnp_StartDevice(device_object, irp);
   1.400 -  case IRP_MN_QUERY_CAPABILITIES:
   1.401 -//    KdPrint((__DRIVER_NAME "     IRP_MN_QUERY_CAPABILITIES\n"));
   1.402 -    stack->Parameters.DeviceCapabilities.Capabilities->NoDisplayInUI = 1;
   1.403 -    status = XenConfig_SendAndWaitForIrp(device_object, irp);
   1.404 -    status = irp->IoStatus.Status = STATUS_SUCCESS;
   1.405 -    IoCompleteRequest(irp, IO_NO_INCREMENT);
   1.406 -//    KdPrint((__DRIVER_NAME " <-- " __FUNCTION__"\n"));
   1.407 -    return status;
   1.408 -#endif
   1.409 -  default:
   1.410 -    IoSkipCurrentIrpStackLocation(irp);
   1.411 -    status = IoCallDriver(xcdd->lower_do, irp);
   1.412 -    break;
   1.413 -  }
   1.414 -
   1.415 -//  KdPrint((__DRIVER_NAME " <-- " __FUNCTION__ " (returning with status %08x)\n", status));
   1.416 -
   1.417 -  return status;
   1.418 -}