134 lines
4.5 KiB
C
134 lines
4.5 KiB
C
|
/***************************************************************************
|
|||
|
|
|||
|
Copyright (c) 2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
Dot4Usb.sys - Lower Filter Driver for Dot4.sys for USB connected
|
|||
|
IEEE 1284.4 devices.
|
|||
|
|
|||
|
File Name:
|
|||
|
|
|||
|
AddDev.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
AddDevice - Create and initialize device object and attach device
|
|||
|
object to the device stack.
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode only
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|||
|
PURPOSE.
|
|||
|
|
|||
|
Copyright (c) 2000 Microsoft Corporation. All Rights Reserved.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
01/18/2000 : created
|
|||
|
|
|||
|
ToDo in this File:
|
|||
|
|
|||
|
Author(s):
|
|||
|
|
|||
|
Doug Fritz (DFritz)
|
|||
|
Joby Lafky (JobyL)
|
|||
|
|
|||
|
****************************************************************************/
|
|||
|
|
|||
|
#include "pch.h"
|
|||
|
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/* AddDevice */
|
|||
|
/************************************************************************/
|
|||
|
//
|
|||
|
// Routine Description:
|
|||
|
//
|
|||
|
// Create and initialize device object and attach device
|
|||
|
// object to the device stack.
|
|||
|
//
|
|||
|
// Arguments:
|
|||
|
//
|
|||
|
// DriverObject - pointer to Dot4Usb.sys driver object
|
|||
|
// Pdo - pointer to the PDO of the device stack that
|
|||
|
// we attach our device object to
|
|||
|
//
|
|||
|
// Return Value:
|
|||
|
//
|
|||
|
// NTSTATUS
|
|||
|
//
|
|||
|
// Log:
|
|||
|
// 2000-05-03 Code Reviewed - TomGreen, JobyL, DFritz
|
|||
|
//
|
|||
|
/************************************************************************/
|
|||
|
NTSTATUS
|
|||
|
AddDevice(
|
|||
|
IN PDRIVER_OBJECT DriverObject,
|
|||
|
IN PDEVICE_OBJECT Pdo
|
|||
|
)
|
|||
|
{
|
|||
|
PDEVICE_OBJECT devObj;
|
|||
|
NTSTATUS status = IoCreateDevice( DriverObject,
|
|||
|
sizeof(DEVICE_EXTENSION),
|
|||
|
NULL, // no name
|
|||
|
FILE_DEVICE_UNKNOWN,
|
|||
|
FILE_DEVICE_SECURE_OPEN,
|
|||
|
FALSE, // not exclusive
|
|||
|
&devObj );
|
|||
|
|
|||
|
if( NT_SUCCESS(status) ) {
|
|||
|
|
|||
|
PDEVICE_OBJECT lowerDevObj = IoAttachDeviceToDeviceStack( devObj, Pdo );
|
|||
|
|
|||
|
if( lowerDevObj ) {
|
|||
|
|
|||
|
PDEVICE_EXTENSION devExt = (PDEVICE_EXTENSION)devObj->DeviceExtension;
|
|||
|
|
|||
|
RtlZeroMemory(devExt, sizeof(DEVICE_EXTENSION));
|
|||
|
|
|||
|
devExt->LowerDevObj = lowerDevObj; // send IRPs to this device
|
|||
|
devExt->Signature1 = DOT4USBTAG; // constant over the lifetime of object
|
|||
|
devExt->Signature2 = DOT4USBTAG;
|
|||
|
devExt->PnpState = STATE_INITIALIZED;
|
|||
|
devExt->DevObj = devObj;
|
|||
|
devExt->Pdo = Pdo;
|
|||
|
devExt->ResetWorkItemPending=0;
|
|||
|
|
|||
|
devExt->SystemPowerState = PowerSystemWorking;
|
|||
|
devExt->DevicePowerState = PowerDeviceD0;
|
|||
|
devExt->CurrentPowerIrp = NULL;
|
|||
|
|
|||
|
IoInitializeRemoveLock( &devExt->RemoveLock,
|
|||
|
DOT4USBTAG,
|
|||
|
5, // MaxLockedMinutes - only used on chk'd builds
|
|||
|
255 ); // HighWaterMark - only used on chk'd builds
|
|||
|
|
|||
|
KeInitializeSpinLock( &devExt->SpinLock );
|
|||
|
KeInitializeEvent( &devExt->PollIrpEvent, NotificationEvent, FALSE );
|
|||
|
|
|||
|
devObj->Flags |= DO_DIRECT_IO;
|
|||
|
devObj->Flags |= ( devExt->LowerDevObj->Flags & DO_POWER_PAGABLE );
|
|||
|
devObj->Flags &= ~DO_DEVICE_INITIALIZING; // DO_POWER_PAGABLE must be set appropriately
|
|||
|
// before clearing this bit to avoid a bugcheck
|
|||
|
|
|||
|
} else {
|
|||
|
TR_FAIL(("AddDevice - IoAttachDeviceToDeviceStack - FAIL"));
|
|||
|
status = STATUS_UNSUCCESSFUL; // for lack of a more appropriate status code
|
|||
|
}
|
|||
|
|
|||
|
} else {
|
|||
|
TR_FAIL(("AddDevice - IoCreateDevice - FAIL - status= %x", status));
|
|||
|
}
|
|||
|
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
|