191 lines
3.6 KiB
C
191 lines
3.6 KiB
C
/*++
|
||
|
||
Copyright (c) 1991-1998 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
memcard.c
|
||
|
||
Abstract:
|
||
|
||
Author:
|
||
|
||
Neil Sandlin (neilsa) 26-Apr-99
|
||
|
||
Environment:
|
||
|
||
Kernel mode only.
|
||
|
||
--*/
|
||
#include "pch.h"
|
||
|
||
//
|
||
// Internal References
|
||
//
|
||
|
||
NTSTATUS
|
||
DriverEntry(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PUNICODE_STRING RegistryPath
|
||
);
|
||
|
||
VOID
|
||
MemCardUnload(
|
||
IN PDRIVER_OBJECT DriverObject
|
||
);
|
||
|
||
NTSTATUS
|
||
MemCardCreateClose(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text(INIT,DriverEntry)
|
||
|
||
#pragma alloc_text(PAGE,MemCardCreateClose)
|
||
#endif
|
||
|
||
|
||
NTSTATUS
|
||
DriverEntry(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PUNICODE_STRING RegistryPath
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine is the driver's entry point, called by the I/O system
|
||
to load the driver. The driver's entry points are initialized and
|
||
a mutex to control paging is initialized.
|
||
|
||
In DBG mode, this routine also examines the registry for special
|
||
debug parameters.
|
||
|
||
Arguments:
|
||
|
||
DriverObject - a pointer to the object that represents this device
|
||
driver.
|
||
|
||
RegistryPath - a pointer to this driver's key in the Services tree.
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS unless we can't allocate a mutex.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS ntStatus = STATUS_SUCCESS;
|
||
|
||
|
||
MemCardDump(MEMCARDSHOW, ("MemCard: DriverEntry\n") );
|
||
|
||
//
|
||
// Initialize the driver object with this driver's entry points.
|
||
//
|
||
DriverObject->MajorFunction[IRP_MJ_CREATE] = MemCardCreateClose;
|
||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = MemCardCreateClose;
|
||
DriverObject->MajorFunction[IRP_MJ_READ] = MemCardIrpReadWrite;
|
||
DriverObject->MajorFunction[IRP_MJ_WRITE] = MemCardIrpReadWrite;
|
||
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MemCardDeviceControl;
|
||
DriverObject->MajorFunction[IRP_MJ_PNP] = MemCardPnp;
|
||
DriverObject->MajorFunction[IRP_MJ_POWER] = MemCardPower;
|
||
|
||
DriverObject->DriverUnload = MemCardUnload;
|
||
|
||
DriverObject->DriverExtension->AddDevice = MemCardAddDevice;
|
||
|
||
return ntStatus;
|
||
}
|
||
|
||
|
||
VOID
|
||
MemCardUnload(
|
||
IN PDRIVER_OBJECT DriverObject
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Unload the driver from the system. The paging mutex is freed before
|
||
final unload.
|
||
|
||
Arguments:
|
||
|
||
DriverObject - a pointer to the object that represents this device
|
||
driver.
|
||
|
||
Return Value:
|
||
|
||
none
|
||
|
||
--*/
|
||
|
||
{
|
||
MemCardDump( MEMCARDSHOW, ("MemCardUnload:\n"));
|
||
|
||
//
|
||
// The device object(s) should all be gone by now.
|
||
//
|
||
ASSERT( DriverObject->DeviceObject == NULL );
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
NTSTATUS
|
||
MemCardCreateClose(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine is called only rarely by the I/O system; it's mainly
|
||
for layered drivers to call. All it does is complete the IRP
|
||
successfully.
|
||
|
||
Arguments:
|
||
|
||
DeviceObject - a pointer to the object that represents the device
|
||
that I/O is to be done on.
|
||
|
||
Irp - a pointer to the I/O Request Packet for this request.
|
||
|
||
Return Value:
|
||
|
||
Always returns STATUS_SUCCESS, since this is a null operation.
|
||
|
||
--*/
|
||
|
||
{
|
||
UNREFERENCED_PARAMETER( DeviceObject );
|
||
|
||
MemCardDump(
|
||
MEMCARDSHOW,
|
||
("MemCardCreateClose...\n")
|
||
);
|
||
|
||
//
|
||
// Null operation. Do not give an I/O boost since
|
||
// no I/O was actually done. IoStatus.Information should be
|
||
// FILE_OPENED for an open; it's undefined for a close.
|
||
//
|
||
|
||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||
Irp->IoStatus.Information = FILE_OPENED;
|
||
|
||
IoCompleteRequest( Irp, IO_NO_INCREMENT );
|
||
|
||
return STATUS_SUCCESS;
|
||
}
|
||
|
||
|