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

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

?? tmif.c

?? PNX系列設備驅動 PNX系列設備驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*---------------------------------------------------------------------------- 
COPYRIGHT (c) 1997 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
//	980603	Tilakraj Roy	Ported to Win 95 
//
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
//				SYSTEM INCLUDE FILES
//////////////////////////////////////////////////////////////////////////////
#ifdef TMMAN_WIN95

#define WANTVXDWRAPS
#include <basedef.h>
#include <vmm.h>
#include <vmmreg.h>
#include <vxdwraps.h>
#include <vpicd.h>
#include <configmg.h>
#include <vwin32.h>

#endif


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

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

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


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


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

TMStatus	tmmanKernelModeNegotiateVersion ( tmmanVersion* Version );

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

BOOL tmmanOpen(
	VOID )
{
	DWORD			NTStatus;
	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++;
	
	return 1;

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:
#ifdef TMMAN_WIN95
	return 0;
#endif
}

DWORD tmmanClose(
	VOID )
{
	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--;
#ifdef TMMAN_WIN95
	return 1;
#endif

tmmanCloseExit1:
#ifdef TMMAN_WIN95
	return 0;
#endif
}

DWORD _stdcall tmmanDeviceControl( 
	DWORD Service, 
	DWORD DDB, 
	DWORD Device, 
	PDIOCPARAMETERS DIOCParam )
{
	PVOID	IOParameters = (PVOID)DIOCParam->lpvInBuffer;
	DWORD	ReturnInformation = 0;
    
    
    // assume that IO Manager will be calling us only with IRP_MJ_DEVICE_CONTROL

	switch ( Service )
	{
		case DIOC_OPEN:
        	// Must return 0 to tell WIN32 that this VxD supports DEVIOCTL
			if  (!tmmanOpen())
				return 1;
			return 0;

		case DIOC_CLOSEHANDLE:
			return tmmanClose();

		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;
			if ( TMIF->DSPNumber < TMManGlobal->DeviceCount )
			{
				TMIF->DSPHandle = (UInt32)TMManGlobal->DeviceList[TMIF->DSPNumber];
				TMIF->Status = statusSuccess;

			}
			else
			{
				TMIF->Status = statusDSPNumberOutofRange;
			}
			ReturnInformation = sizeof ( tmifDSPOpen );
			
		}
		break;

		case constIOCTLtmmanDSPClose : // vxd callable
		{
			tmifGenericFunction* TMIF = 	
				(tmifGenericFunction*)IOParameters;

			TMIF->Status = statusSuccess;
			ReturnInformation = sizeof ( tmifGenericFunction );

		}
		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, DeviceIdx;
			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,
				(Pointer*)&TMIF->Info.SDRAM.PhysicalAddress,
				(Pointer*)&Dummy,
				&TMIF->Info.SDRAM.Size );

			halGetTMPCIInfo ( 
				TMManDevice->HalHandle,
				&TMIF->Info.TMDeviceVendorID,
				&TMIF->Info.TMSubSystemID,
				&TMIF->Info.TMClassRevisionID );

			halGetBridgePCIInfo ( 
				TMManDevice->HalHandle,
				&TMIF->Info.BridgeDeviceVendorID,
				&TMIF->Info.BridgeSubsystemID,
				&TMIF->Info.BridgeClassRevisionID );

			TMIF->Info.DSPNumber = TMManDevice->DSPNumber;
			TMIF->Status = statusSuccess;
			ReturnInformation = sizeof ( tmifDSPInfo );

		}
		break;


		case	constIOCTLtmmanDSPLoad :
		{
			tmifDSPLoad*	TMIF =
				(tmifDSPLoad*)IOParameters;
			TMManDeviceObject* TMManDevice = (TMManDeviceObject*)TMIF->DSPHandle;
			// don't do anything in kernel mode for now

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av网站在线观看| 色诱亚洲精品久久久久久| yourporn久久国产精品| 91.com在线观看| 国产精品高潮久久久久无| 免费看精品久久片| 91麻豆福利精品推荐| 久久你懂得1024| 免费日韩伦理电影| 欧美日韩一区久久| 亚洲免费观看在线视频| 国产精品系列在线播放| 日韩欧美色电影| 亚洲一区二区三区不卡国产欧美| 成人午夜大片免费观看| 久久久久99精品一区| 日本aⅴ精品一区二区三区 | 亚洲一区二区三区国产| www.色综合.com| 国产色产综合色产在线视频| 久久99国产精品久久99果冻传媒| 欧美日韩高清在线| 亚洲一区二区三区免费视频| 色系网站成人免费| 中文字幕亚洲一区二区av在线| 国产精品一区二区三区网站| 久久先锋影音av| 国产一区二区免费视频| 久久综合资源网| 韩国女主播成人在线观看| 精品人在线二区三区| 欧美aaaaa成人免费观看视频| 欧美日韩视频第一区| 亚洲成人动漫精品| 51精品久久久久久久蜜臀| 免费观看久久久4p| 日韩欧美你懂的| 国产综合久久久久久鬼色| 久久一日本道色综合| 国产精品亚洲第一| 国产精品高潮呻吟| 91精彩视频在线观看| 亚洲线精品一区二区三区八戒| 欧美无人高清视频在线观看| 亚洲a一区二区| 日韩免费看的电影| 国产精品一区二区x88av| 国产精品久久久久久久久动漫| 99精品视频在线播放观看| 亚洲免费在线电影| 91精品国产入口| 国产麻豆欧美日韩一区| 国产精品美女久久久久久2018| 一本到不卡免费一区二区| 天堂成人免费av电影一区| 日韩欧美激情四射| 不卡免费追剧大全电视剧网站| 亚洲制服丝袜av| 日韩精品一区二区三区中文不卡 | 精品视频999| 久久精品99国产国产精| 欧美激情自拍偷拍| 欧美日韩一区小说| 国产91精品精华液一区二区三区| 日韩久久一区二区| 欧美一级一级性生活免费录像| 成人在线一区二区三区| 午夜精品免费在线观看| 国产视频一区二区在线| 欧美日韩一区二区三区在线看 | 日本欧美一区二区三区| 国产精品美女久久久久aⅴ| 欧美视频在线播放| 国产成人综合在线观看| 亚洲成人午夜电影| 国产精品视频一二三区| 91精品国产色综合久久| 色婷婷综合久久久久中文| 国产精品主播直播| 日本欧洲一区二区| 亚洲综合激情网| 国产精品天美传媒| 精品国产a毛片| 欧美性xxxxx极品少妇| av高清久久久| 国产成人av一区| 久久精品国产免费| 亚洲成va人在线观看| 亚洲素人一区二区| 久久先锋影音av鲁色资源| 91精品国产综合久久精品麻豆 | 欧美一区二区三区四区五区| 色综合视频在线观看| 国产不卡视频在线观看| 琪琪一区二区三区| 天堂蜜桃一区二区三区| 亚洲一区电影777| 一区二区三区丝袜| 亚洲激情六月丁香| 18成人在线观看| 国产精品第五页| 国产精品人人做人人爽人人添| 久久综合狠狠综合| 久久综合中文字幕| 精品久久久久久久人人人人传媒| 欧美色综合天天久久综合精品| 色诱视频网站一区| 日本韩国一区二区| 欧美少妇性性性| 欧美日韩成人综合| 9191成人精品久久| 日韩欧美激情四射| 精品噜噜噜噜久久久久久久久试看| 欧美美女黄视频| 欧美军同video69gay| 欧美肥胖老妇做爰| 欧美一区二区三级| 欧美成人高清电影在线| 日韩美女主播在线视频一区二区三区| 777午夜精品免费视频| 制服丝袜亚洲精品中文字幕| 91麻豆精品国产综合久久久久久| 欧美日韩午夜在线视频| 欧美精品一级二级三级| 日韩一区二区麻豆国产| 欧美精品一区二区三区在线播放| 精品国产乱码久久久久久久久| 26uuu国产一区二区三区| 国产亚洲va综合人人澡精品| 中文字幕日韩一区二区| 一区二区三区在线观看动漫 | 国产在线不卡视频| 国产91综合网| 色综合天天视频在线观看| 欧美日韩国产综合草草| 精品久久久久久无| 亚洲欧洲精品一区二区三区不卡| 亚洲精品亚洲人成人网| 蜜桃精品在线观看| 成人激情黄色小说| 欧美日韩国产影片| 国产日韩欧美在线一区| 亚洲精品欧美专区| 免费观看久久久4p| 不卡的电影网站| 91精品国产色综合久久不卡蜜臀| 久久久久国产免费免费 | 国产在线视视频有精品| 91网站最新地址| 91精品国模一区二区三区| 欧美激情一区二区| 日韩高清电影一区| www.综合网.com| 日韩欧美一级在线播放| 国产精品成人一区二区艾草 | 色老汉av一区二区三区| 欧美第一区第二区| 亚洲在线中文字幕| 成人小视频在线观看| 91精品国产色综合久久ai换脸| 国产精品欧美综合在线| 日韩国产在线一| av亚洲精华国产精华| 精品国产在天天线2019| 亚洲va国产天堂va久久en| 丰满少妇在线播放bd日韩电影| 欧美日韩日日摸| 中文子幕无线码一区tr| 麻豆91精品91久久久的内涵| 色综合天天综合| 中文字幕第一区第二区| 青青草伊人久久| 欧美美女一区二区| 亚洲一区中文日韩| 成人动漫在线一区| 久久久综合视频| 韩国一区二区视频| 欧美一级久久久| 亚洲成人手机在线| 欧美在线高清视频| 亚洲欧洲精品天堂一级| 成人深夜视频在线观看| 亚洲精品在线免费观看视频| 日本一区中文字幕| 欧美无砖砖区免费| 亚洲一级不卡视频| 欧美色爱综合网| 亚洲精品视频观看| 色妹子一区二区| 日韩伦理免费电影| 91最新地址在线播放| 国产精品天美传媒| 成人av网站在线观看免费| 国产精品午夜电影| 成人高清视频免费观看| 国产精品高潮呻吟久久| www..com久久爱| 国产精品久久久久天堂| 成人18视频在线播放| 亚洲视频在线一区|