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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 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設置為 \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' );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级免费电影| 天堂av在线一区| 欧美日韩成人在线| 国产一区二区看久久| 亚洲一区二区欧美日韩 | 日韩三级av在线播放| 国产**成人网毛片九色| 日韩vs国产vs欧美| 亚洲免费观看高清完整版在线观看熊 | 日韩欧美精品在线视频| 久久久三级国产网站| 欧美性生活久久| 国产成人激情av| 爽好多水快深点欧美视频| 日本一区二区三区国色天香| 欧美浪妇xxxx高跟鞋交| 成人黄页在线观看| 毛片av一区二区三区| 一区二区三区在线免费播放| 国产午夜精品久久久久久久| 欧美一区二区三区免费视频| 99久久精品国产毛片| 国产一区二区三区综合| 日精品一区二区三区| 亚洲欧美福利一区二区| 日本一区二区三区四区| 欧美电视剧在线看免费| 欧美日韩精品欧美日韩精品一| www.亚洲色图| 国产激情一区二区三区| 免费观看久久久4p| 视频精品一区二区| 亚洲成人精品一区| 亚洲激情av在线| 日韩理论片一区二区| 中文字幕高清一区| 欧美国产欧美亚州国产日韩mv天天看完整| 日韩一区二区高清| 欧美一区二区视频免费观看| 欧美日韩中文精品| 欧美日韩一区二区三区不卡| 91精彩视频在线| 欧美在线你懂得| 色综合久久精品| 色猫猫国产区一区二在线视频| 暴力调教一区二区三区| 波多野结衣欧美| 色视频成人在线观看免| 一本色道亚洲精品aⅴ| 99re8在线精品视频免费播放| 波多野结衣91| 在线一区二区三区做爰视频网站| 95精品视频在线| 欧美视频在线一区二区三区| 欧美日本国产视频| 日韩限制级电影在线观看| 欧美精品一区二区三区高清aⅴ| 精品国产一区二区三区久久久蜜月| 日韩视频一区二区在线观看| 精品久久国产97色综合| 亚洲国产精品ⅴa在线观看| |精品福利一区二区三区| 亚洲在线观看免费| 蜜臀av国产精品久久久久| 国产美女久久久久| 91美女在线观看| 欧美日韩亚洲综合在线| 日韩欧美在线123| 久久久综合激的五月天| 亚洲图片激情小说| 日韩国产欧美一区二区三区| 国产老肥熟一区二区三区| 成人免费观看av| 欧美久久久影院| 精品美女被调教视频大全网站| 国产片一区二区| 亚洲自拍偷拍图区| 国内久久婷婷综合| www.av精品| 欧美一区二区三区日韩视频| 欧美激情一二三区| 亚洲成人你懂的| 高清在线成人网| 欧美另类高清zo欧美| 国产欧美日韩中文久久| 亚洲一区二区三区四区不卡| 国模无码大尺度一区二区三区| 成人午夜视频网站| 欧美日韩极品在线观看一区| 26uuu欧美日本| 亚洲最快最全在线视频| 国产一区二区精品久久99| 欧美色区777第一页| 久久久久国产免费免费| 亚洲成人tv网| 不卡的电影网站| 91麻豆精品久久久久蜜臀 | 久久久亚洲精品一区二区三区 | 国产成人午夜片在线观看高清观看| 色88888久久久久久影院按摩| 精品伦理精品一区| 亚洲国产日韩综合久久精品| 国产精品18久久久久久久网站| 欧美亚洲尤物久久| 中文字幕中文字幕在线一区 | 久久影视一区二区| 午夜电影网亚洲视频| 91在线免费播放| 久久久久久久久久久久久久久99| 亚洲图片欧美色图| 99久久久久免费精品国产| 亚洲精品一区二区三区福利| 亚洲国产精品一区二区www| www.综合网.com| 国产日韩影视精品| 美女一区二区三区| 7777精品伊人久久久大香线蕉经典版下载 | 国产亚洲人成网站| 免费不卡在线视频| 欧美日韩国产一二三| 亚洲人成影院在线观看| jiyouzz国产精品久久| 久久嫩草精品久久久久| 精品一区二区三区在线视频| 欧美一区二区精品| 午夜精品123| 在线中文字幕一区| 亚洲永久精品国产| 色94色欧美sute亚洲线路一久 | 成人午夜激情片| 久久久国际精品| 国产乱码一区二区三区| 久久尤物电影视频在线观看| 国产尤物一区二区| 日韩免费高清电影| 久久精品国产精品亚洲红杏| 在线观看91精品国产麻豆| 亚洲一二三区不卡| 欧美日韩免费观看一区二区三区| 亚洲精品免费在线播放| 在线观看国产日韩| 天堂一区二区在线免费观看| 欧美色综合网站| 无码av中文一区二区三区桃花岛| 欧美性猛交一区二区三区精品| 亚洲另类色综合网站| 色婷婷综合久久久久中文 | 国模冰冰炮一区二区| 久久综合久久99| 国产精品一区久久久久| 国产午夜久久久久| 91网站最新地址| 亚洲综合激情另类小说区| 制服丝袜亚洲网站| 精品一区二区三区免费观看| 久久久久久久久久久黄色| 丰满少妇在线播放bd日韩电影| 国产精品污网站| 91久久精品一区二区三区| 婷婷夜色潮精品综合在线| 日韩欧美国产综合一区| 国产很黄免费观看久久| 国产精品理伦片| 欧美色老头old∨ideo| 日韩二区在线观看| 国产视频911| 一本大道久久a久久精品综合| 亚洲.国产.中文慕字在线| 日韩精品一区二区三区中文精品| 国产成人8x视频一区二区| 一区二区三区精品视频| 欧美一区永久视频免费观看| 国内外成人在线| 亚洲精品免费在线观看| 日韩午夜激情免费电影| 不卡一二三区首页| 久久精品国产一区二区三| 久久久九九九九| 欧美亚洲高清一区二区三区不卡| 人禽交欧美网站| 亚洲国产精品成人综合色在线婷婷| 91行情网站电视在线观看高清版| 秋霞电影一区二区| 国产精品国模大尺度视频| 在线成人午夜影院| 成人免费视频一区| 日本va欧美va欧美va精品| 国产精品第13页| 日韩一区二区三区视频在线观看 | 91亚洲永久精品| 日韩成人一级大片| 亚洲欧洲日韩在线| 精品美女在线播放| 欧美色窝79yyyycom| 高清成人免费视频| 日韩成人免费电影| 一区二区在线免费观看| 精品日韩在线观看| 欧美精选午夜久久久乱码6080| 国产69精品久久久久777|