mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.3 KiB
119 lines
3.3 KiB
/*++
|
|
|
|
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;
|
|
}
|
|
|
|
|