120 lines
3.3 KiB
C
120 lines
3.3 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (C) Microsoft Corporation, 2000
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
init.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This file contains the initialization code for iSCSI port driver.
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
kernel mode only
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
#include "port.h"
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DriverEntry(
|
|||
|
IN PDRIVER_OBJECT DriverObject,
|
|||
|
IN PUNICODE_STRING RegistryPath
|
|||
|
);
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text(INIT, DriverEntry)
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
DriverEntry(
|
|||
|
IN PDRIVER_OBJECT DriverObject,
|
|||
|
IN PUNICODE_STRING RegistryPath
|
|||
|
)
|
|||
|
/*+++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Entry point for the driver.
|
|||
|
|
|||
|
Arguements:
|
|||
|
|
|||
|
DriverObject - Pointer to the driver object created by the system.
|
|||
|
RegistryPath - Registry path for the driver
|
|||
|
|
|||
|
Return Value :
|
|||
|
|
|||
|
STATUS_SUCCESS if initialization was successful
|
|||
|
Appropriate NTStatus code on failure
|
|||
|
--*/
|
|||
|
{
|
|||
|
NTSTATUS status;
|
|||
|
PISCSIPORT_DRIVER_EXTENSION driverExtension = NULL;
|
|||
|
|
|||
|
DebugPrint((3, "iSCSI Port DriverEntry\n"));
|
|||
|
|
|||
|
status = IoAllocateDriverObjectExtension(DriverObject,
|
|||
|
(PVOID) ISCSI_TAG_DRIVER_EXTENSION,
|
|||
|
sizeof(ISCSIPORT_DRIVER_EXTENSION),
|
|||
|
&driverExtension);
|
|||
|
if (NT_SUCCESS(status)) {
|
|||
|
RtlZeroMemory(driverExtension,
|
|||
|
sizeof(ISCSIPORT_DRIVER_EXTENSION));
|
|||
|
driverExtension->DriverObject = DriverObject;
|
|||
|
driverExtension->RegistryPath.Length = RegistryPath->Length;
|
|||
|
driverExtension->RegistryPath.MaximumLength =
|
|||
|
RegistryPath->MaximumLength;
|
|||
|
driverExtension->RegistryPath.Buffer =
|
|||
|
ExAllocatePoolWithTag(PagedPool,
|
|||
|
RegistryPath->MaximumLength,
|
|||
|
ISCSI_TAG_REGPATH);
|
|||
|
if (driverExtension->RegistryPath.Buffer == NULL) {
|
|||
|
return STATUS_NO_MEMORY;
|
|||
|
}
|
|||
|
|
|||
|
RtlCopyUnicodeString(&(driverExtension->RegistryPath),
|
|||
|
RegistryPath);
|
|||
|
|
|||
|
//
|
|||
|
// Hard code bus type for now
|
|||
|
//
|
|||
|
driverExtension->BusType = BusTypeScsi;
|
|||
|
|
|||
|
} else if (status == STATUS_OBJECT_NAME_COLLISION) {
|
|||
|
|
|||
|
//
|
|||
|
// Extension already exists. Get a pointer to it
|
|||
|
//
|
|||
|
driverExtension = IoGetDriverObjectExtension(
|
|||
|
DriverObject,
|
|||
|
(PVOID) ISCSI_TAG_DRIVER_EXTENSION);
|
|||
|
ASSERT(driverExtension != NULL);
|
|||
|
} else {
|
|||
|
DebugPrint((1, "iSCSI : Could not allocate driver extension %lx\n",
|
|||
|
status));
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Update the driver object with the entry points
|
|||
|
//
|
|||
|
DriverObject->MajorFunction[IRP_MJ_SCSI] = iScsiPortGlobalDispatch;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_CREATE] = iScsiPortGlobalDispatch;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_CLOSE] = iScsiPortGlobalDispatch;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = iScsiPortGlobalDispatch;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_PNP] = iScsiPortGlobalDispatch;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_POWER] = iScsiPortGlobalDispatch;
|
|||
|
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = iScsiPortGlobalDispatch;
|
|||
|
|
|||
|
DriverObject->DriverUnload = iScsiPortUnload;
|
|||
|
DriverObject->DriverExtension->AddDevice = iScsiPortAddDevice;
|
|||
|
|
|||
|
return STATUS_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
|