127 lines
2.8 KiB
C
127 lines
2.8 KiB
C
/*++
|
||
|
||
Copyright (c) 1991 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
devobj.c
|
||
|
||
Abstract:
|
||
|
||
This module contains code which implements the DEVICE_CONTEXT object.
|
||
|
||
The device context object is a structure which contains a
|
||
system-defined DEVICE_OBJECT followed by information which is maintained
|
||
by the provider, called the context.
|
||
|
||
Author:
|
||
|
||
Colin Watson (ColinW) 13-Mar-1991
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "nb.h"
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text(INIT, NbCreateDeviceContext)
|
||
|
||
#endif
|
||
|
||
|
||
NTSTATUS
|
||
NbCreateDeviceContext(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PUNICODE_STRING DeviceName,
|
||
IN OUT PDEVICE_CONTEXT *DeviceContext,
|
||
IN PUNICODE_STRING RegistryPath
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine creates and initializes a device context structure.
|
||
|
||
Arguments:
|
||
|
||
|
||
DriverObject - pointer to the IO subsystem supplied driver object.
|
||
|
||
DeviceContext - Pointer to a pointer to a transport device context object.
|
||
|
||
DeviceName - pointer to the name of the device this device object points to.
|
||
|
||
RegistryPath - The name of the Netbios node in the registry.
|
||
|
||
Return Value:
|
||
|
||
STATUS_SUCCESS if all is well; STATUS_INSUFFICIENT_RESOURCES otherwise.
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS status;
|
||
PDEVICE_OBJECT deviceObject;
|
||
PDEVICE_CONTEXT deviceContext;
|
||
PAGED_CODE();
|
||
|
||
|
||
//
|
||
// Create the device object for NETBEUI.
|
||
//
|
||
|
||
status = IoCreateDevice(
|
||
DriverObject,
|
||
sizeof (DEVICE_CONTEXT) + RegistryPath->Length - sizeof (DEVICE_OBJECT),
|
||
DeviceName,
|
||
FILE_DEVICE_TRANSPORT,
|
||
FILE_DEVICE_SECURE_OPEN,
|
||
FALSE,
|
||
&deviceObject);
|
||
|
||
if (!NT_SUCCESS(status)) {
|
||
return status;
|
||
}
|
||
// DeviceContext contains:
|
||
// the device object
|
||
// Intialized
|
||
// RegistryPath
|
||
|
||
deviceContext = (PDEVICE_CONTEXT)deviceObject;
|
||
|
||
deviceObject->Flags |= DO_DIRECT_IO;
|
||
|
||
//
|
||
// Determine the IRP stack size that we should "export".
|
||
//
|
||
|
||
deviceObject->StackSize = GetIrpStackSize(
|
||
RegistryPath,
|
||
NB_DEFAULT_IO_STACKSIZE);
|
||
|
||
deviceContext->RegistryPath.MaximumLength = RegistryPath->Length;
|
||
deviceContext->RegistryPath.Buffer = (PWSTR)(deviceContext+1);
|
||
RtlCopyUnicodeString( &deviceContext->RegistryPath, RegistryPath );
|
||
|
||
//
|
||
// Initialize the driver object with this driver's entry points.
|
||
//
|
||
|
||
DriverObject->MajorFunction [IRP_MJ_CREATE] = NbDispatch;
|
||
DriverObject->MajorFunction [IRP_MJ_CLOSE] = NbDispatch;
|
||
DriverObject->MajorFunction [IRP_MJ_CLEANUP] = NbDispatch;
|
||
DriverObject->MajorFunction [IRP_MJ_DEVICE_CONTROL] = NbDispatch;
|
||
|
||
DriverObject-> DriverUnload = NbDriverUnload;
|
||
|
||
*DeviceContext = deviceContext;
|
||
|
||
return STATUS_SUCCESS;
|
||
}
|