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

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

?? tmif.c

?? PNX系列設備驅動 PNX系列設備驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*---------------------------------------------------------------------------- 
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
//
//	960405	Tilakraj Roy 	Created
//	960710	Tilakraj Roy	Started adding code for tmman inteface 
//	961008	Tilakraj Roy	Added code for shared memory allocaiton interfaces.
//	961010	Tilakraj Roy	Added code for image loading, running & stopping
//	970806	Tilakraj Roy	Ported to Workstation V4.0
//	010828	Wim de Haan		Changed code to remove compiler warnings:
//							Line 1175: '-' : incompatible types - from 'void *'
//							to 'unsigned char *'
//							Line 1175: '=' : 'void *' differs in levels of
//							 indirection from 'int '
//
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
//				SYSTEM INCLUDE FILES
//////////////////////////////////////////////////////////////////////////////

#include "wdm.h"

//////////////////////////////////////////////////////////////////////////////
//				DRIVER INCLUDE FILES
//////////////////////////////////////////////////////////////////////////////

#include "tmmanapi.h"
#include "tmmanlib.h"
#include "platform.h"
#include "verinfo.h"
#include "tmif.h"

//////////////////////////////////////////////////////////////////////////////
//				MANIFEST CONSTANTS
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
//				TYPEDEFS
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
//				PROTOTYPES
//////////////////////////////////////////////////////////////////////////////

TMStatus	tmmanKernelModeNegotiateVersion ( tmmanVersion* Version );

//////////////////////////////////////////////////////////////////////////////
//				IMPLEMENTATION
//////////////////////////////////////////////////////////////////////////////

NTSTATUS tmmanOpen(
    IN PDEVICE_OBJECT pdo,
    IN PIRP Irp )
{
	UInt32				ClientIdx, DeviceIdx;
	ClientObject*		Client;
	PVOID			Process;

	Process = PsGetCurrentProcess();
	
	DPF(1,("tmman:tmmanOpen:Process[%x]:\n", Process ));

	// search for an empty slot.
	DPF(1,("tmman:tmmanOpen:ClientList:"));
	for ( ClientIdx = 0 ; ClientIdx < TMManGlobal->MaximumClients ; ClientIdx ++ )
	{
		if ( TMManGlobal->ClientList[ClientIdx] )
		{
			DPF(1,("[#%x:%x]", 
				ClientIdx, ((ClientObject*)TMManGlobal->ClientList[ClientIdx])->Process ));
			continue;
		}
		else
		{
			break;
		}
	}

	DPF(1,("\n"));

	if ( ClientIdx == TMManGlobal->MaximumClients )
	{
		DPF(0,("tmman:tmmanOpen:NoMoreClientsFree\n"));
		goto tmmanOpenExit1;
	}
		
	TMManGlobal->ClientList[ClientIdx] = memAllocate (  
		sizeof ( ClientObject ) + sizeof ( ClientDeviceObject ) * ( TMManGlobal->DeviceCount - 1 ) ); 

	if ( TMManGlobal->ClientList[ClientIdx] == Null )
	{
		DPF(0,("tmman:tmmanOpen:memAllocate:FAIL\n"));
		goto tmmanOpenExit1;	
	}
	
	Client = TMManGlobal->ClientList[ClientIdx];
	Client->Process = Process;
	Client->DeviceCount = TMManGlobal->DeviceCount;

	// initialize the per device data structures
	// BUGCHECK - we have to go by Client->DeviceCount since devices could have
	// gone away Workstation 5.0 problem.
	for ( DeviceIdx = 0 ; DeviceIdx < TMManGlobal->DeviceCount ; DeviceIdx++ )
	{
		TMManDeviceObject* TMManDevice = TMManGlobal->DeviceList[DeviceIdx];
		UInt32	Dummy, Length;
		UInt32	AddrKernel;
		
		Client->Device[DeviceIdx].Device = TMManDevice;

		halGetMMIOInfo (
			TMManDevice->HalHandle,
			(Pointer*)&Dummy,
			(Pointer*)&AddrKernel,
			&Length );

		// map mmio so that it can be acessed from user mode
		 if ( ( Client->Device[DeviceIdx].MMIOAddrUser = 
			sectionMapPhysicalAddress ( 
			AddrKernel, 
			Length,
			&Client->Device[DeviceIdx].MMIOHandleUser ) ) == NULL )
		{
			DPF(0,("tmman:tmmanOpen:sectionMapPhysicalAddress:MMIO:FAIL\n" ));
			goto	tmmanOpenExit2;
		}


		if ( TMManGlobal->MapSDRAM )
		{
			halGetSDRAMInfo (
				TMManDevice->HalHandle,
				(Pointer*)&Dummy,
				(Pointer*)&AddrKernel,
				&Length );

			if ( ( Client->Device[DeviceIdx].SDRAMAddrUser = 
				sectionMapPhysicalAddress ( 
				AddrKernel, 
				Length,
				&Client->Device[DeviceIdx].SDRAMHandleUser ) ) == NULL )
			{
				DPF(0,("tmman:tmmanOpen:sectionMapPhysicalAddress:SDRAM:FAIL\n" ));

				sectionUnmapPhysicalAddress ( 
					Client->Device[DeviceIdx].MMIOAddrUser,
					Client->Device[DeviceIdx].MMIOHandleUser );

				goto	tmmanOpenExit2;
			}
		}


		if ( ( Client->Device[DeviceIdx].MemoryAddrUser = 
			sectionMapPhysicalAddress ( 
			(UInt32)TMManDevice->MemoryBlock, 
			TMManDevice->MemoryBlockSize,
			&Client->Device[DeviceIdx].MemoryHandleUser ) ) == NULL )
		{
			DPF(0,("tmman:tmmanOpen:sectionMapPhysicalAddress:MEMORY:FAIL\n" ));
			
			if ( TMManGlobal->MapSDRAM )
			{
				sectionUnmapPhysicalAddress ( 
					Client->Device[DeviceIdx].SDRAMAddrUser,
					Client->Device[DeviceIdx].SDRAMHandleUser );
			}

			sectionUnmapPhysicalAddress ( 
				Client->Device[DeviceIdx].MMIOAddrUser,
				Client->Device[DeviceIdx].MMIOHandleUser );
			goto	tmmanOpenExit2;
		}

	}

	TMManGlobal->ClientCount++;
	
	Irp->IoStatus.Information = 0;
	Irp->IoStatus.Status = STATUS_SUCCESS;
	IoCompleteRequest (Irp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;

tmmanOpenExit2:

	for ( /* use the current DeviceIdx */ ; DeviceIdx > 0 ; DeviceIdx-- )
	{
		sectionUnmapPhysicalAddress ( 
			Client->Device[DeviceIdx - 1].MemoryAddrUser,
			Client->Device[DeviceIdx - 1].MemoryHandleUser );

		if ( TMManGlobal->MapSDRAM )
		{
			sectionUnmapPhysicalAddress ( 
				Client->Device[DeviceIdx - 1].SDRAMAddrUser,
				Client->Device[DeviceIdx - 1].SDRAMHandleUser );
		}

		sectionUnmapPhysicalAddress ( 
			Client->Device[DeviceIdx - 1].MMIOAddrUser,
			Client->Device[DeviceIdx - 1].MMIOHandleUser );
	}

	memFree ( TMManGlobal->ClientList[ClientIdx] );

tmmanOpenExit1:
	Irp->IoStatus.Information = 0;
	Irp->IoStatus.Status = STATUS_DEVICE_BUSY;
	IoCompleteRequest (Irp, IO_NO_INCREMENT);
	return STATUS_DEVICE_BUSY;
}

NTSTATUS tmmanClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp )
{
	UInt32				ClientIdx, DeviceIdx;
	ClientObject*		Client;
	PVOID			Process;

	Process = PsGetCurrentProcess();
	
	DPF(1,("tmman:tmmanClose:Process[%x]\n", Process ));

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

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

	if ( ClientIdx == TMManGlobal->MaximumClients )
	{
		DPF(0,("tmman:tmmanClose:PANIC:InvalidHandle:Process[%x]\n", Process ));
		goto tmmanCloseExit1;
	}
	// assume one open handle per process context		
	// if we have more than slot of a single process than
	// we are smoking something we are not supposed to
	// since tmman32.dll is the only one who calls CreateProcess
	// during ATTACH_PROCESS
	
	Client = TMManGlobal->ClientList[ClientIdx];

	

	// initialize the per device data structures
	// BUGCHECK - we have to go by Client->DeviceCount 
	for ( DeviceIdx = 0 ; DeviceIdx < TMManGlobal->DeviceCount ; DeviceIdx++ )
	{
		TMManDeviceObject* TMManDevice = TMManGlobal->DeviceList[DeviceIdx];

		memoryManagerDestroyMemoryByClient (
			TMManDevice->MemoryManagerHandle, 
			(UInt32)Process );

		messageManagerDestroyMessageByClient (
			TMManDevice->MessageManagerHandle, 
			(UInt32)Process );

		eventManagerDestroyEventByClient (
			TMManDevice->EventManagerHandle, 
			(UInt32)Process );

		sgbufferManagerDestroySGBufferByClient (
			TMManDevice->SGBufferManagerHandle, 
			(UInt32)Process );

		sectionUnmapPhysicalAddress ( 
			Client->Device[DeviceIdx].MMIOAddrUser, 
			Client->Device[DeviceIdx].MMIOHandleUser );

		if ( TMManGlobal->MapSDRAM )
		{
			sectionUnmapPhysicalAddress ( 
				Client->Device[DeviceIdx].SDRAMAddrUser,
				Client->Device[DeviceIdx].SDRAMHandleUser );
		}

		sectionUnmapPhysicalAddress ( 
			Client->Device[DeviceIdx].MemoryAddrUser,
			Client->Device[DeviceIdx].MemoryHandleUser );
		
	
	}

	memFree ( TMManGlobal->ClientList[ClientIdx] );

	TMManGlobal->ClientList[ClientIdx] = NULL;
	
	TMManGlobal->ClientCount--;

	Irp->IoStatus.Information = 0;
	Irp->IoStatus.Status = STATUS_SUCCESS;
	IoCompleteRequest (Irp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;

tmmanCloseExit1:
	Irp->IoStatus.Information = 0;
	Irp->IoStatus.Status = STATUS_DEVICE_BUSY;
	IoCompleteRequest (Irp, IO_NO_INCREMENT);
	return STATUS_DEVICE_BUSY;
}

NTSTATUS tmmanDeviceControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp )
{
	PIO_STACK_LOCATION  IOStackLocation;
	PVOID	IOParameters = Irp->AssociatedIrp.SystemBuffer;
	ULONG	ReturnInformation = 0;
    
	IOStackLocation = IoGetCurrentIrpStackLocation ( Irp );

    // assume that IO Manager will be calling us only with IRP_MJ_DEVICE_CONTROL

	switch ( IOStackLocation->Parameters.DeviceIoControl.IoControlCode )
	{

		case constIOCTLtmmanNegotiateVersion : // vxd callable
		{
			tmifNegotiateVersion* TMIF = 	
				(tmifNegotiateVersion*)IOParameters;

			TMIF->Status = tmmanKernelModeNegotiateVersion ( &TMIF->Version );
			ReturnInformation = sizeof ( tmifNegotiateVersion );
		}
		break;

		case constIOCTLtmmanDSPOpen : // vxd callable
		{
			tmifDSPOpen* TMIF = 	
				(tmifDSPOpen*)IOParameters;
			TMManDeviceObject* TMManDevice;

			ReturnInformation = sizeof ( tmifDSPOpen );

			if ( TMIF->DSPNumber >= TMManGlobal->MaximumDevices )
			{	
				TMIF->Status = statusDSPNumberOutofRange;
				break;
			}

			if ( ! TMManGlobal->DeviceList[TMIF->DSPNumber] ) 
			{
				TMIF->Status = statusDSPNumberOutofRange;
				break;
			}

			TMManDevice =
				(TMManDeviceObject*)TMManGlobal->DeviceList[TMIF->DSPNumber];

			// currently we are treating stops and removes the same way.
			if ( ( TMManDevice->Stopped ) || ( TMManDevice->Removed ) )
			{
				TMIF->Status = statusHardwareUnavailable;
				break;
			}

			InterlockedIncrement ( &TMManDevice->References ); 

			if ( 1 == TMManDevice->References  )
			{
				KeClearEvent ( &TMManDevice->RemoveEvent );
				KeClearEvent ( &TMManDevice->StopEvent );
			}

			TMIF->DSPHandle = (UInt32)TMManGlobal->DeviceList[TMIF->DSPNumber]; 
			TMIF->Status = statusSuccess;
		}
		break;

		case constIOCTLtmmanDSPClose : // vxd callable
		{
			tmifGenericFunction* TMIF = 	
				(tmifGenericFunction*)IOParameters;
			TMManDeviceObject* TMManDevice = (TMManDeviceObject*)TMIF->Handle;

			ReturnInformation = sizeof ( tmifGenericFunction );

			if ( ! TMManDevice )
			{
				TMIF->Status = statusHardwareUnavailable;
				break;
			}

			InterlockedDecrement ( &TMManDevice->References ); 

			if ( 0 == TMManDevice->References  )
			{
				KeSetEvent ( &TMManDevice->RemoveEvent,
					IO_NO_INCREMENT,
					FALSE );

				KeSetEvent ( &TMManDevice->StopEvent,
					IO_NO_INCREMENT,
					FALSE );
			}

			TMIF->Status = statusSuccess;
		}
		break;

		case constIOCTLtmmanDSPGetNum : // vxd callable
		{
			tmifDSPNum* TMIF = 	
				(tmifDSPNum*)IOParameters;
		
			TMIF->DSPCount = TMManGlobal->DeviceCount;
			TMIF->Status = statusSuccess;
			ReturnInformation = sizeof ( tmifDSPNum );

		}
		break;

		case	constIOCTLtmmanDSPInfo : // vxd callable
		{
			tmifDSPInfo*	TMIF =
				(tmifDSPInfo*)IOParameters;


			TMManDeviceObject* TMManDevice = (TMManDeviceObject*)TMIF->DSPHandle;
			UInt32	ClientIdx;
			UInt32	Dummy;
			PVOID			Process;
			ClientObject*		Client;

			Process = PsGetCurrentProcess();

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

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

			if ( ClientIdx == TMManGlobal->MaximumClients )
			{
				DPF(0,("tmman:tmmanDeviceControl:PANIC:tmmanDSPInfo:InvalidHandle:Process[%x]\n", 
					Process));
				TMIF->Status = statusInvalidHandle;
				ReturnInformation = sizeof ( tmifDSPInfo );
				break;
			}

			Client = TMManGlobal->ClientList[ClientIdx];
			
			TMIF->Info.MMIO.MappedAddress = 
				(UInt32)Client->Device[TMManDevice->DSPNumber].MMIOAddrUser;

			TMIF->Info.SDRAM.MappedAddress = 
				(UInt32)Client->Device[TMManDevice->DSPNumber].SDRAMAddrUser;

			halGetMMIOInfo (
				TMManDevice->HalHandle,
				(Pointer*)&TMIF->Info.MMIO.PhysicalAddress,
				(Pointer*)&Dummy,
				&TMIF->Info.MMIO.Size );
	

			halGetSDRAMInfo (
				TMManDevice->HalHandle,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区成人在线视频| 极品美女销魂一区二区三区| 亚洲va中文字幕| 精品一区二区在线看| 99久久免费精品高清特色大片| 91精品国产丝袜白色高跟鞋| 亚洲欧洲日韩一区二区三区| 色综合久久88色综合天天免费| 日韩欧美一级在线播放| 亚洲一区二区四区蜜桃| 黄页网站大全一区二区| 欧美色图一区二区三区| 国产精品福利一区| 国产毛片精品视频| 在线播放91灌醉迷j高跟美女 | 日韩欧美一级精品久久| 亚洲欧美在线视频观看| 国产精品资源站在线| 欧美高清www午色夜在线视频| 夜色激情一区二区| eeuss鲁一区二区三区| 久久国产尿小便嘘嘘| 欧美日韩一区在线| 亚洲自拍偷拍麻豆| 91在线观看污| 国产精品伦一区二区三级视频| 国产一区二区三区四区在线观看| 在线成人高清不卡| 偷拍日韩校园综合在线| 亚洲美女电影在线| 成人黄色免费短视频| 亚洲国产精品传媒在线观看| 国产一区二区三区美女| 久久精品亚洲精品国产欧美| 国产在线精品一区二区夜色| 精品av久久707| 久久精品国产99| 精品久久人人做人人爱| 欧美军同video69gay| 亚洲一区二区三区小说| 日本精品一级二级| 亚洲一区av在线| 欧美精品一级二级三级| 日韩高清不卡一区二区三区| 91精品国产欧美一区二区18| 日本美女一区二区三区视频| 欧美mv日韩mv亚洲| 国产精品18久久久久久vr| 久久久久久久久久久电影| 国产精品资源在线| 亚洲欧洲成人av每日更新| 亚洲国产高清不卡| 国产成人av一区二区三区在线 | 亚洲国产欧美一区二区三区丁香婷| 色哟哟日韩精品| 亚洲国产成人91porn| 欧美专区亚洲专区| 欧美影院一区二区三区| 日韩国产一二三区| 久久综合久久久久88| av成人动漫在线观看| 亚洲成av人在线观看| 精品国产露脸精彩对白| 成人免费观看男女羞羞视频| 亚洲小少妇裸体bbw| 欧美变态口味重另类| 久久综合九色综合欧美98| www.日本不卡| 蜜臀久久久久久久| 欧美国产激情一区二区三区蜜月| 精品视频在线视频| 国产乱子轮精品视频| 樱花影视一区二区| 精品99久久久久久| 色天天综合久久久久综合片| 欧美系列在线观看| 91碰在线视频| 日韩一二在线观看| 欧美xxx久久| 色综合视频一区二区三区高清| 性感美女久久精品| 国产精品久久久久影院色老大 | 日本一区二区三区国色天香| 亚洲欧洲日韩女同| 亚洲精品在线电影| 欧美色中文字幕| av午夜精品一区二区三区| 免费成人深夜小野草| 亚洲精品欧美二区三区中文字幕| 精品日韩成人av| 欧美亚洲尤物久久| 99精品久久99久久久久| 精彩视频一区二区| 91在线观看污| 国精产品一区一区三区mba桃花| 亚洲一区在线免费观看| 国产精品久久久久久久第一福利| 日韩视频一区在线观看| 欧美在线播放高清精品| 暴力调教一区二区三区| 国产精选一区二区三区| 日本视频免费一区| 亚洲成在线观看| 福利一区二区在线| 久久不见久久见免费视频7| 亚洲国产精品欧美一二99| 亚洲人成网站色在线观看| 中文字幕乱码一区二区免费| 欧美xxxx老人做受| 精品福利一区二区三区| 91麻豆精品国产无毒不卡在线观看 | 国产麻豆9l精品三级站| 久久99久久99| 久久精品久久综合| 精品在线视频一区| 国产一区二区免费看| 激情五月激情综合网| 黄页网站大全一区二区| 国产九九视频一区二区三区| 日韩欧美色综合网站| 欧美一级免费大片| 日韩一级成人av| 日韩精品一区在线| 精品国产免费人成在线观看| 久久亚区不卡日本| 国产三级欧美三级| 中文字幕日韩一区二区| 亚洲激情图片qvod| 亚洲成人1区2区| 男人的天堂久久精品| 欧美日本一区二区三区| 91精品国产91综合久久蜜臀| 欧美成人官网二区| 亚洲国产精品精华液2区45| 亚洲少妇中出一区| 午夜免费久久看| 久久99久久精品欧美| 粉嫩av一区二区三区粉嫩 | 国产综合一区二区| 欧美刺激脚交jootjob| 久久久噜噜噜久久中文字幕色伊伊| 日本一区二区在线不卡| 一区二区国产视频| 免费在线看成人av| 国产成a人亚洲| 在线观看视频91| 91精品久久久久久久99蜜桃| 国产午夜一区二区三区| 亚洲精品国产a| 精品一区二区三区免费播放| 欧美精品一区二区三区在线 | 日韩av成人高清| 国产一区二区三区最好精华液| av一区二区三区在线| 欧美美女黄视频| 国产欧美日韩精品a在线观看| 亚洲精品亚洲人成人网在线播放| 欧美最新大片在线看| 精品处破学生在线二十三| 综合久久一区二区三区| 美国十次综合导航| 成人黄色大片在线观看| 91精品国产品国语在线不卡| 中文字幕日本乱码精品影院| 免费精品视频在线| 91视频免费播放| 精品处破学生在线二十三| 亚洲国产日韩a在线播放性色| 日韩欧美一二三| 一个色妞综合视频在线观看| 国产精品66部| 日韩视频免费直播| 亚洲免费观看高清完整| 国产99久久久国产精品| 日韩欧美久久一区| 亚洲国产一区二区在线播放| 成人免费视频国产在线观看| 欧美xxxxxxxxx| 日本欧美一区二区在线观看| 国产欧美日韩在线观看| 蜜桃视频一区二区三区在线观看| 色婷婷综合激情| 国产精品色呦呦| 国产精品亚洲专一区二区三区| 91麻豆精品国产综合久久久久久| 一区二区三区四区乱视频| www.av亚洲| 国产精品福利一区二区| 国产91对白在线观看九色| 欧美精品一区二区三区蜜桃视频| 日韩精品欧美成人高清一区二区| 国产精品卡一卡二| 粉嫩嫩av羞羞动漫久久久| 国产视频一区二区三区在线观看 | 国产亚洲一区字幕| 国内不卡的二区三区中文字幕 | 一区二区三区在线高清| 国产精品污污网站在线观看 | 欧美激情资源网| 麻豆精品一区二区三区|