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

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

?? osal.c

?? PNX系列設(shè)備驅(qū)動 PNX系列設(shè)備驅(qū)動
?? C
字號:
/*---------------------------------------------------------------------------- 
COPYRIGHT (c) 1998 by Philips Semiconductors

THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED AND COPIED IN 
ACCORDANCE WITH THE TERMS AND CONDITIONS OF SUCH A LICENSE AND WITH THE 
INCLUSION OF THE THIS COPY RIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIES 
OF THIS SOFTWARE MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER
PERSON. THE OWNERSHIP AND TITLE OF THIS SOFTWARE IS NOT TRANSFERRED. 

THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ANY PRIOR NOTICE
AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY Philips Semiconductor. 

PHILIPS ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF THIS SOFTWARE
ON PLATFORMS OTHER THAN THE ONE ON WHICH THIS SOFTWARE IS FURNISHED.
----------------------------------------------------------------------------*/
/*
	HISTORY
	960510	Tilakraj Roy 	Created
	961019	Tilakraj Roy	Moved the CTC 1.1 bug fix in IRQGen from IRQAck.
	970521	Tilakraj Roy	Rewrote for Generic Target TMMan
	010828	Wim de Haan		Changed code to prevent crash of tmmanSGBufferCreate
							and tmmanSGBuferDestroy. Source: Eric N.							
			Functions pagetableCreate() and pagetableDestroy().  In the creation 
			function is a call to IoMapTransfer(), with a NULL parameter for the 
			DMA adapter object.  While a few older bits of documentation say you 
			can do this for bus-mastering cards that have their own 
			scatter/gather hardware, it is apparently not permissible in WDM.  
			You must pass in the valid adapter object (of which a copy is kept in 
			the HalObject from TMHAL.C).  The same applies to the 
			IoFlushAdapterBuffers() call during destruction.
*/

/*----------------------------------------------------------------------------
          SYSTEM INCLUDE FILES
----------------------------------------------------------------------------*/
#include "stddef.h"
#include "wdm.h"

/*----------------------------------------------------------------------------
          DRIVER SPECIFIC INCLUDE FILES
----------------------------------------------------------------------------*/
#include "tmmanapi.h"
#include "tmmanlib.h"
#include "platform.h"

/* Synchronization Object Abstraction Functions */
typedef	struct	tagSynchronizationObject
{
	UInt32	UserModeHandle;
	UInt32	KernelModeHandle;	
	UInt32	SynchronizationFlags;
}	SynchronizationObject;

Bool	syncobjCreate ( 
	UInt32 SynchronizationFlags,
	UInt32	OSSynchronizationHandle,
	UInt32 *SynchronizationHandlePointer,
	Int8* SynchronizationObjectName )
{
	SynchronizationObject* SyncObj;
	NTSTATUS	NTStatus;

	if ( ( SyncObj = ExAllocatePool ( 
		NonPagedPool, 
		sizeof ( SynchronizationObject ) ) ) == NULL )
	{
		goto syncobjCreateExit1;
	}

	SyncObj->SynchronizationFlags = SynchronizationFlags;

	if ( SynchronizationFlags == constTMManModuleHostUser )
	{
		SyncObj->UserModeHandle =  OSSynchronizationHandle;
		NTStatus = ObReferenceObjectByHandle (
				(HANDLE)SyncObj->UserModeHandle, 
				STANDARD_RIGHTS_ALL,
				NULL,
				KernelMode,
				(PVOID*)&SyncObj->KernelModeHandle, 
				NULL );
		if ( ! NT_SUCCESS (NTStatus) )
		{
			goto syncobjCreateExit2;
			
		}
	}
	else 
	{
		// assume that it is constTMManModuleHostKernel
		SyncObj->KernelModeHandle = OSSynchronizationHandle;
	}

	*SynchronizationHandlePointer = (UInt32)SyncObj;
	return True;

syncobjCreateExit2:
	ExFreePool ( SyncObj );

syncobjCreateExit1:
	return False;
}

Bool	syncobjSignal ( 
	UInt32 SynchronizationHandle )
{
	SynchronizationObject* SyncObj = (SynchronizationObject*)SynchronizationHandle;

	if ( KeSetEvent ( 
		(PKEVENT)SyncObj->KernelModeHandle,
		(KPRIORITY)0,
		 FALSE) == FALSE )
	{
		return False;
	}
	else
	{
		return True;
	}
}

/* user will do his own blokcing 
	we don't provide any blocking functionality 

Bool	syncobjBlock ( 
	UInt32 SynchronizationObject )
{
	WaitForSingleObject ( (HANDLE)SynchronizationObject, INFINITE );
	return True;
}
*/

Bool	syncobjDestroy ( 
	UInt32 SynchronizationHandle )
{
	SynchronizationObject* SyncObj = (SynchronizationObject*)SynchronizationHandle;

	if ( SyncObj->SynchronizationFlags == constTMManModuleHostUser )
	{
		ObDereferenceObject ( (PVOID)SyncObj->KernelModeHandle );
	}
	ExFreePool ( SyncObj );

	return True;
}


Bool	critsectCreate ( 
	UInt32* CriticalSectionObjectPointer )
{
	PKSPIN_LOCK SpinLock;

	SpinLock = ExAllocatePool(NonPagedPool , sizeof(KSPIN_LOCK) );

	if ( ! SpinLock  )
		return False;

	KeInitializeSpinLock ( (PKSPIN_LOCK)SpinLock );

	*CriticalSectionObjectPointer = (UInt32)SpinLock;

	return True;
}

Bool	critsectDestroy ( 
	UInt32 CriticalSectionObject )
{
	ExFreePool ( (Pointer) CriticalSectionObject );
	return True;
}

/* Note that the caller has to allocate storage 
	sizeof (UInt32) for nested context and pass the address
	of that parameter to this function.
*/
Bool	critsectEnter ( 
	UInt32 CriticalSectionObject, Pointer NestedContext )
{
	KeAcquireSpinLock ( (PKSPIN_LOCK)CriticalSectionObject, 
		(PKIRQL)NestedContext );
	return True;
}

Bool	critsectLeave ( 
	UInt32 CriticalSectionObject, Pointer NestedContext )
{
	KeReleaseSpinLock ( (PKSPIN_LOCK)CriticalSectionObject, 
		*((PKIRQL)NestedContext) );
	return True;
}


Pointer	clientGetObjectFromProcess ( UInt32 Process )
{
	UInt32 ClientIdx;

	for ( ClientIdx = 0 ; ClientIdx < TMManGlobal->MaximumClients ; ClientIdx ++ )
	{
		if ( !TMManGlobal->ClientList[ClientIdx] )
			continue;

		if ( ((ClientObject*)TMManGlobal->ClientList[ClientIdx])->Process != 
			(PEPROCESS)Process )
			continue;
		break;
	}

	if ( ClientIdx == TMManGlobal->MaximumClients )
	{
		return NULL;
	}

	return (Pointer)TMManGlobal->ClientList[ClientIdx];
}

// Page Table Routines

typedef	struct	tagPageTableObject
{
	KEVENT	Event;
	PMDL	Mdl;
	Pointer	MapRegisterBase;
	UInt32	MapRegisterCount;
	UInt32	HalHandle;
	BOOLEAN	WriteToDevice;
}	PageTableObject;

IO_ALLOCATION_ACTION
pageTableCallbackRoutine(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID MapRegisterBase,
    IN PVOID Context );

UInt32	pagetableGetTempBufferSize ( 
	UInt32 BufferAddress, UInt32 BufferSize )
{
	return ADDRESS_AND_SIZE_TO_SPAN_PAGES ( BufferAddress, BufferSize ) * sizeof(PageTableEntry);
}

Bool	pagetableCreate ( 
	UInt32 BufferAddress,
	UInt32 BufferSize,
	Pointer TempBuffer,
	UInt32	HalHandle,
	PageTableEntry	**PageTablePointer,
	UInt32 *PageTableEntryCountPointer,
	UInt32 *PageTableHandlePointer )
{
	PageTableObject	*PageTableObj;
	UInt32	SizeOfMdl, BytesMapped, Length;
	PUCHAR	CurrentVa;

	SizeOfMdl = MmSizeOfMdl ( (PVOID)BufferAddress, BufferSize );

	if ( ( PageTableObj = 
		memAllocate ( SizeOfMdl + sizeof ( PageTableObject ) ) ) == NULL )
	{
		goto pagetableCreateExit1;
	}
	
	PageTableObj->Mdl = (PMDL)((UInt8*)PageTableObj) + sizeof ( PageTableObject );

	MmInitializeMdl ( PageTableObj->Mdl, BufferAddress, BufferSize );

	PageTableObj->HalHandle = HalHandle;
	PageTableObj->WriteToDevice = TRUE; // BUGCHECK - we have to get this from above.

	__try	{
		MmProbeAndLockPages (
			PageTableObj->Mdl,			// 
			KernelMode,		// KPROCESSOR_MODE
			IoModifyAccess );	// LOCK_OPERATION

	} __except (EXCEPTION_EXECUTE_HANDLER) {
		goto pagetableCreateExit2; 
	}

	KeInitializeEvent(
        &PageTableObj->Event,
        NotificationEvent,
        FALSE );

    KeResetEvent(&PageTableObj->Event);

	// this function waits for the adapter channel to become free
	if ( halAllocateBusMasterChannel ( 
		PageTableObj->HalHandle,
		PageTableObj,
		pageTableCallbackRoutine ) != True )
	{
		goto pagetableCreateExit3; 
	}

    KeWaitForSingleObject(
		&PageTableObj->Event,
		Executive, 
		KernelMode, 
		FALSE, 
		NULL);

	CurrentVa = MmGetMdlVirtualAddress ( PageTableObj->Mdl );

	BytesMapped = Length = MmGetMdlByteCount ( PageTableObj->Mdl );

	for ( PageTableObj->MapRegisterCount = 0 ; 
		Length ; 
		PageTableObj->MapRegisterCount++ )
	{
		PHYSICAL_ADDRESS	PhysicalAddress;
		
		PhysicalAddress = IoMapTransfer (
			((HalObject*)(PageTableObj->HalHandle))->AdapterObject,
			PageTableObj->Mdl,
			PageTableObj->MapRegisterBase,
			CurrentVa,
			&BytesMapped,
			PageTableObj->WriteToDevice );
		((PageTableEntry*)TempBuffer)[PageTableObj->MapRegisterCount].PhysicalAddress = 
			PhysicalAddress.LowPart;
		((PageTableEntry*)TempBuffer)[PageTableObj->MapRegisterCount].RunLength = 
			BytesMapped;

		CurrentVa += BytesMapped;
		Length -= BytesMapped;
		BytesMapped = Length;
	}

	*PageTablePointer = TempBuffer,
	*PageTableEntryCountPointer = PageTableObj->MapRegisterCount,
	*PageTableHandlePointer  = (UInt32)PageTableObj;

	return True;
/*
pagetableExit4:
	halFreeBusMasterChannel (
		PageTableObj->HalHandle, 
		PageTableObj->MapRegisterBase, 
		PageTableObj->MapRegisterCount );
*/
pagetableCreateExit3:
	MmUnlockPages ( PageTableObj->Mdl );

pagetableCreateExit2:
	memFree ( PageTableObj );

pagetableCreateExit1:
	return False;
}

Bool	pagetableDestroy ( 
	UInt32 PageTableHandle )
{
	PageTableObject	*PageTableObj = (PageTableObject*)PageTableHandle;

	IoFlushAdapterBuffers (
		((HalObject*)(PageTableObj->HalHandle))->AdapterObject,
		PageTableObj->Mdl,
		PageTableObj->MapRegisterBase,
		MmGetMdlVirtualAddress ( PageTableObj->Mdl ),
		MmGetMdlByteCount ( PageTableObj->Mdl ),
		PageTableObj->WriteToDevice );

	MmUnlockPages ( PageTableObj->Mdl );

	halFreeBusMasterChannel ( 
		PageTableObj->HalHandle, 
		PageTableObj->MapRegisterBase, 
		PageTableObj->MapRegisterCount );

	memFree ( PageTableObj );

	return True;
}

IO_ALLOCATION_ACTION
pageTableCallbackRoutine(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID MapRegisterBase,
    IN PVOID Context
    )
{
	PageTableObject	*PageTableObj = (PageTableObject*)Context;

    UNREFERENCED_PARAMETER( DeviceObject );
    UNREFERENCED_PARAMETER( Irp );

    PageTableObj->MapRegisterBase = MapRegisterBase;

    KeSetEvent(
        &PageTableObj->Event,
        0L,
        FALSE );

    return DeallocateObjectKeepRegisters;
}

Pointer	sectionMapPhysicalAddress ( 
	UInt32 Address, 
	UInt32 Length,
	UInt32 *SectionHandlePointer )
{
	PMDL	Mdl;
	PVOID	UserModeVirtualAddress;

	if ( ( Mdl = IoAllocateMdl (
		(PVOID)Address,
		Length,
		FALSE,
		FALSE,
		NULL ) ) == NULL )
	{
        DPF(0,("tmman:sectionMapPhysicalAddress:IoAllocateMdl:FAIL\n"));
		goto sectionMapPhysicalAddressExit1;
	}

	MmBuildMdlForNonPagedPool ( Mdl );

	if ( ( UserModeVirtualAddress = MmMapLockedPages (
		Mdl,
		UserMode ) ) == NULL )
	{
		DPF(0,("tmman:sectionMapPhysicalAddress:MmMapLockedPages:FAIL\n"));
		goto sectionMapPhysicalAddressExit2;
	}

	*SectionHandlePointer = (UInt32)Mdl;
	return UserModeVirtualAddress;


sectionMapPhysicalAddressExit2:
	IoFreeMdl ( Mdl );

sectionMapPhysicalAddressExit1:
	return NULL;
}


void	sectionUnmapPhysicalAddress ( 
	Pointer UserModeVirtualAddress, 
	UInt32 SectionHandle )
{
	MmUnmapLockedPages ( UserModeVirtualAddress, (Pointer)SectionHandle );

	IoFreeMdl ( (Pointer)SectionHandle );
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人av一区二区三区在线| 中文字幕亚洲不卡| 爽好久久久欧美精品| 欧美日韩亚洲高清一区二区| 日韩国产精品久久久久久亚洲| 欧美疯狂性受xxxxx喷水图片| 午夜欧美2019年伦理| 欧美精品vⅰdeose4hd| 国产99久久久国产精品免费看| 国产精品午夜电影| 一本在线高清不卡dvd| 午夜精品一区二区三区免费视频| 国产蜜臀97一区二区三区| 99精品热视频| 亚洲大片免费看| 精品免费视频一区二区| 国产成人精品一区二区三区四区 | 欧美一级日韩一级| 国产美女视频一区| 樱花影视一区二区| 日韩午夜三级在线| 粉嫩一区二区三区在线看| 日韩精品免费专区| 亚洲最快最全在线视频| 日韩欧美高清dvd碟片| 成人app在线观看| 性做久久久久久免费观看欧美| 中文子幕无线码一区tr| 欧美天天综合网| 国产一区二区h| 蜜桃在线一区二区三区| 亚洲欧美日韩国产综合| 日韩亚洲欧美在线观看| 欧美老人xxxx18| 欧美日韩视频在线第一区 | 精品一二三四区| 亚洲视频中文字幕| 精品成人一区二区| 91久久精品网| 国产高清在线观看免费不卡| 久久精品久久综合| 亚洲一区二区三区四区的 | 国产精品伦理在线| 国产精品网站在线| 国产精品欧美一区二区三区| 国产精品毛片久久久久久久| 国产精品麻豆网站| 一区二区三区在线影院| 亚洲国产精品一区二区久久| 欧美激情中文不卡| 国产精品黄色在线观看| 国产亚洲欧洲一区高清在线观看| 欧美视频在线不卡| 在线综合+亚洲+欧美中文字幕| 成人h动漫精品一区二区| 成人av网站免费| 91尤物视频在线观看| 精品一区二区三区免费| 国产一区二区女| 丁香激情综合五月| 韩国欧美一区二区| 日韩精品1区2区3区| 久久99精品国产.久久久久 | 国产成人超碰人人澡人人澡| av在线不卡电影| 国产福利91精品一区| 成人午夜短视频| 日本韩国欧美国产| 7777精品伊人久久久大香线蕉经典版下载 | 中文字幕色av一区二区三区| 伊人开心综合网| 免费久久精品视频| 日本欧美在线观看| 国产精品99久久不卡二区| 极品销魂美女一区二区三区| 国产麻豆视频一区| 色就色 综合激情| 日韩区在线观看| 国产精品久久久久桃色tv| 午夜精品久久久久久| 狠狠色伊人亚洲综合成人| 色综合一区二区| 91久久精品国产91性色tv| 欧美精品粉嫩高潮一区二区| 久久久久成人黄色影片| 中文字幕av资源一区| 亚洲午夜国产一区99re久久| 激情小说欧美图片| 欧洲精品视频在线观看| 在线电影一区二区三区| 久久久久久久电影| 天堂成人免费av电影一区| 成人成人成人在线视频| 日韩三级在线观看| 亚洲影视在线观看| 国产99久久久国产精品潘金| 在线综合亚洲欧美在线视频 | 婷婷久久综合九色国产成人| 成人免费电影视频| 日韩欧美视频在线| 亚洲线精品一区二区三区 | 在线日韩一区二区| 欧美激情艳妇裸体舞| 免费看欧美美女黄的网站| 在线精品亚洲一区二区不卡| 国产午夜三级一区二区三| 蜜臀av在线播放一区二区三区 | 欧美日韩国产经典色站一区二区三区| 欧美精品三级在线观看| 亚洲欧洲av另类| 粉嫩av一区二区三区粉嫩| 日韩欧美的一区二区| 亚洲国产成人av网| 91色乱码一区二区三区| 日本一区二区免费在线观看视频 | 中文字幕一区二区三区四区不卡| 秋霞av亚洲一区二区三| 欧美色图片你懂的| 亚洲天堂成人网| 成人福利在线看| 亚洲国产精品成人综合| 国产精品77777| 欧美videos中文字幕| 免费成人结看片| 欧美日韩极品在线观看一区| 亚洲在线视频一区| 欧美性色欧美a在线播放| 亚洲精品一卡二卡| 在线精品亚洲一区二区不卡| 一区二区在线观看免费视频播放| av不卡免费在线观看| 国产精品情趣视频| www.66久久| 国产精品高潮呻吟| 成人国产精品免费观看| 国产精品国产三级国产普通话99| 国产成人精品免费| 日本一区二区免费在线| 成人av网址在线观看| 最新成人av在线| 91天堂素人约啪| 亚洲摸摸操操av| 欧美午夜免费电影| 日韩制服丝袜先锋影音| 91精品在线麻豆| 美女视频免费一区| 久久无码av三级| 天堂一区二区在线| 91精品欧美综合在线观看最新| 午夜不卡av在线| 日韩精品中文字幕在线不卡尤物 | 日韩一区二区三区四区五区六区| 麻豆精品在线播放| 久久久国产一区二区三区四区小说| 国产成人在线视频网址| 亚洲欧美色一区| 欧美日韩大陆一区二区| 美腿丝袜在线亚洲一区 | 精品国产乱码久久久久久夜甘婷婷 | 69堂国产成人免费视频| 美女免费视频一区| 欧美国产一区二区| 在线观看日韩毛片| 热久久一区二区| 久久精品日产第一区二区三区高清版 | 欧美无人高清视频在线观看| 午夜精品视频一区| 国产午夜三级一区二区三| 色激情天天射综合网| 日韩国产欧美三级| 国产精品视频在线看| 欧美性猛交xxxx黑人交| 另类小说色综合网站| 国产精品久久久久久福利一牛影视 | 亚洲最大的成人av| 日韩精品中午字幕| 91麻豆国产自产在线观看| 日韩二区在线观看| 中文字幕欧美日韩一区| 欧美日韩精品欧美日韩精品 | 欧美系列日韩一区| 国产大陆a不卡| 亚洲一区二区三区四区中文字幕| 精品国产亚洲一区二区三区在线观看| 9色porny自拍视频一区二区| 青青青伊人色综合久久| 国产精品美女久久久久aⅴ | 日韩毛片精品高清免费| 日韩一区二区在线观看视频播放| 99久久精品国产导航| 精品一区二区三区影院在线午夜 | 天使萌一区二区三区免费观看| 久久九九国产精品| 91麻豆精品国产无毒不卡在线观看 | 亚洲欧美自拍偷拍| 久久一夜天堂av一区二区三区| 欧美视频一区二区| 成人黄色免费短视频| 久久99热狠狠色一区二区| 亚洲最大成人网4388xx|