亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? main.c

?? 好東東
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) 2005  Changzhi Zhou All Rights Reserved

Module Name:

    main.c

Abstract:

    This module is main module that deals with
	DriverEntry, AddDevice, Unload, handles to device name.
	SampleIoCrement and SampleIoDecrement.

Environment:

    Kernel mode

Revision History:

	Changzhi Zhou Dec 20  2004

--*/
#include <wdm.h>
#include <ntddk.h>
#include <initguid.h>

#include "main.h"
#include "..\inc\wdmioctl.h"
#include <wmistr.h>
#include <wmilib.h>


#ifdef ALLOC_PRAGMA
#pragma alloc_text (INIT, DriverEntry)
#pragma alloc_text (PAGE, AddDevice)
#pragma alloc_text (PAGE, SamplePnpDispatch)
#pragma alloc_text (PAGE, Unload)
#endif

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
/*++

Routine Description:

    Installable driver initialization entry point.
    This entry point is called directly by the I/O system.

Arguments:

    DriverObject - pointer to the driver object

    RegistryPath - pointer to a unicode string representing the path,
                   to driver-specific key in the registry.

Return Value:

    STATUS_SUCCESS if successful,
    STATUS_UNSUCCESSFUL otherwise.

--*/
{	
	NTSTATUS            status;

    UNREFERENCED_PARAMETER (RegistryPath);

    DbgPrint("------  VirtualSerial Build on %s %s -------\n", __DATE__, __TIME__ );

	status = STATUS_SUCCESS;

    DriverObject->MajorFunction[IRP_MJ_PNP]				= SamplePnpDispatch;
    DriverObject->MajorFunction[IRP_MJ_POWER]			= SamplePowerDispatch;
    DriverObject->MajorFunction[IRP_MJ_CREATE]			= SampleCreate;
    DriverObject->MajorFunction[IRP_MJ_CLOSE]			= SampleClose;
	DriverObject->MajorFunction[IRP_MJ_CLEANUP ]		= SampleCleanup;
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]	= SampleIoControl;

	DriverObject->MajorFunction[IRP_MJ_WRITE]           = SampleWrite;
	DriverObject->MajorFunction[IRP_MJ_READ]            = SampleRead;

    DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = ToasterSystemControl;

    DriverObject->DriverExtension->AddDevice			= AddDevice;
    DriverObject->DriverUnload							= Unload;

    return status;
}



NTSTATUS
AddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject
    )
/*++

Routine Description:

    The Plug & Play subsystem is handing us a brand new PDO, for which we
    (by means of INF registration) have been asked to provide a driver.

    We need to determine if we need to be in the driver stack for the device.
    Create a function device object to attach to the stack
    Initialize that device object
    Return status success.

    Remember: We can NOT actually send ANY non pnp IRPS to the given driver
    stack, UNTIL we have received an IRP_MN_START_DEVICE.

Arguments:

    DeviceObject - pointer to a device object.

    PhysicalDeviceObject -  pointer to a device object created by the
                            underlying bus driver.

Return Value:

    NT status code.

--*/
{
    NTSTATUS                status = STATUS_SUCCESS;
    PDEVICE_OBJECT          deviceObject = NULL;
    PDEVICE_EXTENSION       deviceExtension;


	UNICODE_STRING		deviceObjName;

    PAGED_CODE ();
	DbgPrint("------- AddDevice  build on %s %s ---------\n", __DATE__, __TIME__);

	if( FALSE == InitializeSerialDevName( &deviceObjName ) )
		return STATUS_INSUFFICIENT_RESOURCES;
    status = IoCreateDevice (DriverObject,
                             sizeof (DEVICE_EXTENSION),
                             &deviceObjName,
                             FILE_DEVICE_SERIAL_PORT,
                             FILE_DEVICE_SECURE_OPEN,
                             FALSE,
                             &deviceObject);
    if (!NT_SUCCESS (status)) {
		DebugPrint(("IoCreateDevice failed\n"));
		if ( deviceObjName.Buffer != NULL )
			ExFreePool ( deviceObjName.Buffer );
        return status;
    }

    DebugPrint (("AddDevice PDO (0x%x) FDO (0x%x)\n", PhysicalDeviceObject, deviceObject));

    deviceExtension = (PDEVICE_EXTENSION) deviceObject->DeviceExtension;
	deviceExtension->DeviceName.MaximumLength = deviceObjName.MaximumLength;
	deviceExtension->DeviceName.Length	= deviceObjName.Length;
	deviceExtension->DeviceName.Buffer = deviceObjName.Buffer;
	deviceExtension->CreatedSerialCommEntry = FALSE;
	deviceExtension->CreatedSymbolicLink	= FALSE;

	// for working thread
	KeInitializeSpinLock( &deviceExtension->ThreadSpinLock );

    deviceExtension->NextLowerDriver = IoAttachDeviceToDeviceStack (
                                       deviceObject,
                                       PhysicalDeviceObject);
    if(NULL == deviceExtension->NextLowerDriver) {

        IoDeleteDevice(deviceObject);
        return STATUS_UNSUCCESSFUL;
    }
    DebugPrint(("AddDevice: %x to %x->%x \n", deviceObject, 
                       deviceExtension->NextLowerDriver,
                       PhysicalDeviceObject));
    // Initialize the remove event to not-signaled.
    //
    KeInitializeEvent(&deviceExtension->RemoveEvent, 
                      SynchronizationEvent, 
                      FALSE);
    //
    // Initialize the stop event to signaled.
    // This event is signaled when the OutstandingIO becomes 1
    //
    KeInitializeEvent(&deviceExtension->StopEvent, 
                      SynchronizationEvent, 
                      TRUE);

    deviceExtension->OutStandingIO = 1;
	deviceExtension->bIsOpen		= FALSE;
    
	KeInitializeSpinLock( &deviceExtension->IOCountLock );
	if ( PhysicalDeviceObject->Flags & DO_POWER_PAGABLE) {
        deviceObject->Flags |= DO_POWER_PAGABLE;
    }

    deviceObject->Flags |= DO_DIRECT_IO;
    deviceExtension->Self = deviceObject;

	// Initialize serial-related parameters
	deviceExtension->WaitOnMaskIrp	= NULL;
	deviceExtension->CurrentBaud	= 0;
	deviceExtension->PendingReadIrp	= NULL;
	KeInitializeTimer ( &deviceExtension->ReadTimer );
	KeInitializeDpc ( &deviceExtension->ReadDpc, ReadDpcRoutine, (PVOID)deviceExtension );
	
	RtlZeroMemory( &deviceExtension->SerialStatus, sizeof( SERIAL_STATUS ) );
	// initialize  members relevant to TDI.
	deviceExtension->RxBuffer	= ExAllocatePoolWithTag( NonPagedPool, RINGBUFFER_SIZE, 'RBuf' );
	if ( deviceExtension->RxBuffer == NULL )
		goto Error_Exit;

	deviceExtension->lpRead	= deviceExtension->RxBuffer;
	deviceExtension->lpRx	= deviceExtension->RxBuffer;

	deviceExtension->hTransAddr	= NULL;
	deviceExtension->lpTransAddrFileObject	= NULL;
	deviceExtension->TDILowerDeviceObject	= NULL;
	deviceExtension->RemoteAddress			= 0x601a8c0;	// 192.168.1.6
	deviceExtension->RemotePort				= 0x7217;		// 6002
	RtlZeroMemory( (PVOID)&deviceExtension->recvContext, sizeof( RECV_CONTEXT ) );

	deviceExtension->recvContext.RemainderBuffer = ExAllocatePoolWithTag ( NonPagedPool, RECVREMAINDER_BUFFER_SIZE, 'Rrem' );
	if ( deviceExtension->recvContext.RemainderBuffer == NULL )
		goto Error_Exit;
    KeInitializeEvent(&deviceExtension->recvContext.Event, 
                      SynchronizationEvent,
                      FALSE);
	RtlZeroMemory ( (PVOID)&deviceExtension->recvContext.ReceiveDatagramInfo, sizeof ( TDI_CONNECTION_INFORMATION ) );
	RtlZeroMemory ( (PVOID)&deviceExtension->recvContext.ReturnInfo, sizeof ( TDI_CONNECTION_INFORMATION ) );

    INITIALIZE_PNP_STATE(deviceExtension);
 
	//++ Register device interface for win32app
	status = IoRegisterDeviceInterface( PhysicalDeviceObject,
					(LPGUID)&GUID_CLASS_COMPORT,
					NULL,
					&deviceExtension->InterfaceName );
	DebugPrint(("InterfaceName:  %ws\n", deviceExtension->InterfaceName.Buffer ));
	if( !NT_SUCCESS ( status ) ){
		DebugPrint(( "AddDevice:  IoRegisterDeviceInterface failed (%x) \n", status ));
		goto Error_Exit;
	}
	//--

    deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

    return STATUS_SUCCESS;
Error_Exit:
	if( deviceExtension->RxBuffer  )
	{
		ExFreePool ( deviceExtension->RxBuffer );
		deviceExtension->RxBuffer = NULL;
	}
	if ( deviceExtension->recvContext.RemainderBuffer )
	{
		ExFreePool ( deviceExtension->recvContext.RemainderBuffer );
		deviceExtension->recvContext.RemainderBuffer = NULL;
	}

	IoDetachDevice( deviceExtension->NextLowerDriver );
	IoDeleteDevice( deviceObject );
	return status;

}

NTSTATUS
SerialDoExternalNaming(
	IN PDEVICE_EXTENSION	deviceExtension,
	IN LONG					ComX
	)
/*++

Routine Description:

	Create external name, SymbolicLinkName and DOS name.

Arguments:

    deviceExtension - pointer to a device object extension.

    ComX -  indicates the number of Serial Ports.

Return Value:

    NT status code.

--*/
{
	NTSTATUS		status;
	ULONG			bufLen;
	WCHAR			ComXBuffer[ 4 ];
	UNICODE_STRING	instanceStr;
	DebugPrint(("Enter SerialdoExternalNaming routine...\n"));
	if( deviceExtension->CreatedSymbolicLink || deviceExtension->CreatedSerialCommEntry ){
		DebugPrint(("Already create symboliclink or serial commentry\n"));
		return STATUS_UNSUCCESSFUL;
	}
	ASSERT( deviceExtension->SymbolicLinkName.Buffer == NULL );
	ASSERT( deviceExtension->DosName.Buffer == NULL );

	RtlInitUnicodeString(&instanceStr, NULL);
	instanceStr.MaximumLength = sizeof( ComXBuffer );
	instanceStr.Buffer = ComXBuffer;	// 4 WCHAR
	RtlIntegerToUnicodeString( ComX, 10, &instanceStr );

	// 將SymbolicLinkName設(shè)置為 \DosDevices\COMn 的形式。其中n = ComX
	RtlZeroMemory( &deviceExtension->SymbolicLinkName, sizeof( UNICODE_STRING ) );
	deviceExtension->SymbolicLinkName.MaximumLength = DEVICE_OBJECT_NAME_LENGTH + sizeof( WCHAR );
	deviceExtension->SymbolicLinkName.Buffer = ExAllocatePoolWithTag( PagedPool, deviceExtension->SymbolicLinkName.MaximumLength, 'SymL' );
	if( deviceExtension->SymbolicLinkName.Buffer == NULL ){
		DebugPrint(("SERIAL: Couldn't allocate memory for symbolic link name\n"));
		status = STATUS_INSUFFICIENT_RESOURCES;
		goto SerialDoExternalNamingError;
	}
	RtlZeroMemory( deviceExtension->SymbolicLinkName.Buffer, deviceExtension->SymbolicLinkName.MaximumLength );
	RtlAppendUnicodeToString( &deviceExtension->SymbolicLinkName, DOS_DEVICE_NAME );	//L"\\DosDevices\\COM"
	RtlAppendUnicodeStringToString( &deviceExtension->SymbolicLinkName, &instanceStr);
	DebugPrint(("SymbolicLinkName:   %wZ\n",  deviceExtension->SymbolicLinkName ));

	// 將DosName初始化 COMn 的形式, 其中 n = ComX
	deviceExtension->DosName.MaximumLength = 64 + sizeof(WCHAR);
	deviceExtension->DosName.Buffer = ExAllocatePoolWithTag( PagedPool, 64 + sizeof( WCHAR ), 'Name' );

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区影院| 亚洲国产精品激情在线观看| 欧美在线综合视频| 欧美日韩综合在线| 久久久国际精品| 一区二区三区欧美日韩| 天使萌一区二区三区免费观看| 亚洲人精品午夜| 婷婷丁香激情综合| 国产精品综合一区二区三区| 成人免费视频视频| 日韩亚洲电影在线| 亚洲另类在线制服丝袜| 日本免费新一区视频| 99久久精品情趣| 精品久久久久久久久久久院品网| 欧美极品aⅴ影院| 成人一区二区三区视频在线观看 | 精品av综合导航| 五月天亚洲精品| 91精品福利视频| 国产精品丝袜久久久久久app| 天天亚洲美女在线视频| 色狠狠桃花综合| 亚洲天天做日日做天天谢日日欢| 老司机午夜精品| 精品国产乱码久久久久久牛牛| 一区二区三区在线观看国产| 成人网男人的天堂| 欧美国产日产图区| 成人91在线观看| 国产精品视频一区二区三区不卡| 国产精品一二一区| 国产日韩精品一区| 97精品电影院| 亚洲综合偷拍欧美一区色| 欧美蜜桃一区二区三区| 亚洲午夜国产一区99re久久| 色综合久久66| 视频一区二区三区在线| 日韩三级伦理片妻子的秘密按摩| 激情偷乱视频一区二区三区| 久久精品一级爱片| 欧美亚洲综合另类| 国产在线乱码一区二区三区| 国产三区在线成人av| 一本大道av一区二区在线播放| 亚洲国产精品精华液网站| 欧美区在线观看| 成人av网站在线| 男男gaygay亚洲| 中文字幕日韩一区| 6080yy午夜一二三区久久| 国产美女久久久久| 日韩二区三区四区| 最新不卡av在线| 精品1区2区在线观看| 欧美亚洲图片小说| 国产成人免费在线视频| 日韩成人免费在线| 亚洲影院免费观看| 国产精品盗摄一区二区三区| 日韩欧美一区二区三区在线| jizz一区二区| 成人美女在线观看| 国产美女精品在线| 激情小说欧美图片| 蜜桃传媒麻豆第一区在线观看| 日韩一区欧美小说| 国产精品久久三区| 日本一区二区免费在线观看视频| 日韩三级电影网址| 精品久久久久久久人人人人传媒 | 亚洲一区二区在线免费观看视频 | 97精品久久久午夜一区二区三区| 国产精华液一区二区三区| 狠狠色丁香婷婷综合久久片| 久久99热狠狠色一区二区| 蜜桃视频在线观看一区| 老汉av免费一区二区三区| 伦理电影国产精品| 久久精品国产99国产精品| 九九久久精品视频| 成人久久视频在线观看| 91在线视频网址| 国产制服丝袜一区| www.亚洲精品| 欧美色综合网站| 欧美第一区第二区| 中文字幕中文乱码欧美一区二区| 国产精品电影院| 日日摸夜夜添夜夜添精品视频| 久久9热精品视频| 91在线免费看| 日韩欧美三级在线| ...xxx性欧美| 美女在线视频一区| 91蜜桃视频在线| 日韩精品一区二区三区视频| 国产精品―色哟哟| 久久精品国产一区二区三| 成人网男人的天堂| 久久日一线二线三线suv| 一区二区欧美国产| 国产成人亚洲综合a∨婷婷| 欧美日韩精品免费观看视频| 国产精品色婷婷久久58| 另类中文字幕网| 精品视频999| 亚洲男人的天堂在线观看| 精品一区精品二区高清| 91黄色免费版| 亚洲天堂免费看| 成人在线视频一区二区| 久久这里只有精品视频网| 日韩综合一区二区| 在线视频观看一区| 亚洲精品免费在线播放| 国产精品亚洲一区二区三区妖精| 91精品国产欧美一区二区成人| 亚洲一二三区在线观看| 日本精品一级二级| 亚洲福利一区二区三区| 在线观看不卡一区| 性做久久久久久免费观看欧美| 波多野洁衣一区| 亚洲精品五月天| 91精品在线观看入口| 美女视频黄久久| 久久久777精品电影网影网| 国产成人鲁色资源国产91色综| www国产成人| 99re这里只有精品首页| 一区二区三区在线观看网站| 欧美精品在欧美一区二区少妇| 奇米影视在线99精品| 中文一区二区完整视频在线观看| 国产精品一区二区免费不卡| 最新日韩av在线| 欧美一区二区免费观在线| 国产电影一区二区三区| 国产精品青草综合久久久久99| 91免费在线看| 久久精品国产一区二区| 亚洲免费av高清| 国产欧美日韩一区二区三区在线观看| 99re热这里只有精品视频| 免费人成在线不卡| 自拍偷拍国产亚洲| 日本一区二区三区高清不卡| 欧美日韩精品欧美日韩精品一综合| 精品在线播放免费| 亚洲第一久久影院| 国产精品美女久久福利网站| 欧美精品高清视频| 26uuu久久综合| 制服丝袜中文字幕一区| 色婷婷综合五月| 92国产精品观看| 成人午夜又粗又硬又大| 国产在线精品一区二区三区不卡 | 欧美专区亚洲专区| 91香蕉国产在线观看软件| 国产精品伊人色| 国产风韵犹存在线视精品| 国内精品免费**视频| 蜜桃视频第一区免费观看| 日韩av电影天堂| 蜜臀91精品一区二区三区| 日韩二区在线观看| 久久精品久久99精品久久| 久久er99热精品一区二区| 全国精品久久少妇| 久久精品国产99国产| 国产精品一区在线| 成人福利视频在线| aaa欧美大片| 欧美日韩一区中文字幕| 欧美一级日韩不卡播放免费| 91精品国产综合久久婷婷香蕉 | 国产成人亚洲精品青草天美| 粉嫩一区二区三区性色av| 99视频一区二区| 白白色 亚洲乱淫| 欧美在线|欧美| 亚洲精品一区二区三区影院 | 成人性视频网站| 欧美在线观看18| 欧美精品一区二区高清在线观看| 欧美激情一区不卡| 午夜精品免费在线| 99久久精品国产观看| 日韩欧美在线网站| 亚洲一区在线观看网站| 国产精品一线二线三线| 欧美一卡二卡在线| 亚洲欧美成aⅴ人在线观看 | 久久久99久久| 美女网站视频久久| 欧美三级中文字幕在线观看|