Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

133 lines
4.5 KiB

/***************************************************************************
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;
}