Compartir a través de


Rutina DispatchCreateClose

Muchos conductores, especialmente los conductores de nivel inferior en una cadena de conductores superpuestas, simplemente necesitan establecer su existencia en la recepción de una solicitud de creación y simplemente necesitan confirmar la recepción de una solicitud cercana .

Por ejemplo, un controlador de puerto para un controlador de dispositivo con uno o varios controladores de clase estrechamente acoplados que llaman a IoGetDeviceObjectPointer podría tener una rutina DispatchCreateClose mínima. La rutina podría no hacer nada más que completar el IRP de la siguiente manera:

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

Esta rutina dispatchCreateClose mínima establece el miembro Information del bloque de estado de E/S en cero, lo que indica que el objeto de archivo se abre para una solicitud de creación; La información no tiene ningún significado para una solicitud de cierre. La rutina establece el miembro Status en STATUS_SUCCESS y también devuelve este valor de estado, lo que indica que el controlador está listo para aceptar solicitudes de E/S.

Esta rutina mínima DispatchCreateClose completa la creación de IRP sin aumentar la prioridad del originador del IRP (IO_NO_INCREMENT), ya que se supone que el originador espera un intervalo indeterminado pero muy pequeño para que se complete la solicitud.

La cantidad de trabajo que hace una rutina DispatchCreateClose depende en parte de la naturaleza del dispositivo del controlador o del dispositivo subyacente y en parte del diseño del controlador. Si un controlador realiza operaciones muy diferentes para crear y cerrar solicitudes, debe controlar estas solicitudes en rutinas DispatchCreate y DispatchClose independientes.

Para controlar una solicitud de creación para abrir un objeto de archivo que represente un dispositivo lógico o físico, un controlador de nivel superior debe hacer lo siguiente:

  1. Llame a IoGetCurrentIrpStackLocation para obtener un puntero a su ubicación de pila de E/S en el IRP.

  2. Compruebe FileObject. FileName en la ubicación de la pila de E/S y complete el IRP con STATUS_SUCCESS si la cadena Unicode en FileName tiene una longitud cero; de lo contrario, complete el IRP con STATUS_INVALID_PARAMETER.

Siguiendo los pasos anteriores se asegura de que ningún intento de abrir un pseudoarchivo en un dispositivo puede causar problemas más adelante. Por ejemplo, esto impide que se intente abrir un \\device\parallel0\temp.dat inexistente.