⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 device.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 4 页
字号:
													lpvInBuf,
													dwInBufSize,
													lpvOutBuf,
													dwOutBufSize,
													lpdwBytesReturned );
			Sys_ReleaseException();
		}
	}
	return bRetv;
}


// *****************************************************************
// 声明:static LPOBJLIST FindDevice( LPCTSTR lpszName, UINT index )
// 参数:
//		IN lpszName - 设备名,例如:"COM5"
//		IN index - 设备索引号, 从0 ~ 9
// 返回值:
//		假如发现,返回该设备的对象指针;否则,返回NULL
// 功能描述:
//		有设备名查找设备对象指针
// 引用: 
// *****************************************************************

static LPOBJLIST FindDevice( LPCTSTR lpszName, UINT index )
{
	LPOBJLIST lpRetv = NULL;
	LPOBJLIST lpObj;
//	int index;
	// 检查参数
 //	if( strlen( lpszName ) < 4 )
//		goto DEV_RET;
//	if( *(lpszName + 3) < '0' || *(lpszName + 3) > '9' )
//		goto DEV_RET;//return FALSE;
//	index = *(lpszName + 3) - '0';

    EnterCriticalSection( &csDeviceObjList ); // 进入冲突段	
	lpObj = (LPOBJLIST)lpDeviceObjList;
	//搜索对象链表
	while( lpObj )
	{
		if( strnicmp( ( (DEVICE_DATA *)lpObj)->lpszName, lpszName, 3 ) == 0 && 
			( (DEVICE_DATA *)lpObj )->index == index )
		{   // 找到。found it
			lpRetv = lpObj;
			break;
		}
		lpObj = lpObj->lpNext; // 下一个对象
	}

//DEV_RET:
	LeaveCriticalSection( &csDeviceObjList ); //离开冲突段

	return lpRetv;
}

// *****************************************************************
// 声明:BOOL _InitDeviceMgr( void )
// 参数:
//		无
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		初始化设备管理器
// 引用: 
//		当设备程序运行时,会调用该函数去初始化设备管理器。devsrc.c 
// *****************************************************************

BOOL _InitDeviceMgr( void )
{
	InitializeCriticalSection( &csDeviceObjList );
#ifdef __DEBUG
	csDeviceObjList.lpcsName = "CS-DEV";
#endif
    return TRUE;
}

// *****************************************************************
// 声明:BOOL _DeinitDeviceMgr( void )
// 参数:
//		无
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		释放设备管理器
// 引用: 
//		当设备程序退出时,会调用该函数去释放设备管理器资源。devsrc.c 
// *****************************************************************

BOOL _DeinitDeviceMgr( void )
{
	DeleteCriticalSection( &csDeviceObjList );
	return TRUE;
}

//////////////////////////////////////////////////////////////////
// file driver mgr

// *****************************************************************
// 声明:static LPDEVFSD GetFSD( LPCTSTR lpcszFSDName )
// 参数:
//		IN lpcszFSDName - 文件系统名
// 返回值:
//		假如成功,返回当前系统存在的文件系统对象指针。否则返回NULL
// 功能描述:
//		得到已加载的文件系统对象
// 引用: 
// *****************************************************************

//	文件系统对象链表
static LPDEVFSD lpFsdList = NULL;

static LPDEVFSD GetFSD( LPCTSTR lpcszFSDName )
{
    LPDEVFSD pfsd = lpFsdList;
    while( pfsd )
    {
        if( stricmp( pfsd->lpszFSDName, lpcszFSDName ) == 0 )
            return pfsd; //找到。found
        pfsd = pfsd->lpNext;
    }
    return NULL;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_RegisterFSD ( LPCTSTR lpcszFSDName, HANDLE hFSDRegister, const FSDINITDRV * lpfsd )
// 参数:
//		IN lpcszFSDName - 文件系统名 
//		IN hFSDRegister - 传递给文件系统初始化接口的参数
//		IN lpfsd - 文件系统初始化接口
// 返回值:
//		假如成功,返回TRUE。否则返回FALSE
// 功能描述:
//		注册文件系统
// 引用: 
// *****************************************************************
#define DEBUG_DEVICE_REGISTERFSD 0
BOOL WINAPI Device_RegisterFSD ( LPCTSTR lpcszFSDName, HANDLE hFSDRegister, const FSDINITDRV * lpfsd )
{	
    LPDEVFSD p;

	// 分配文件系统结构对象
    DEBUGMSG( DEBUG_DEVICE_REGISTERFSD, ( "Device_RegisterFSD: RegisterFSD(=%s).\r\n", lpcszFSDName ) );
	p = (LPDEVFSD)malloc( sizeof( DEVFSD ) + sizeof( FSDINITDRV ) + strlen( lpcszFSDName ) + 1 );
    if( p )
    {
	    EnterCriticalSection( &csDeviceObjList ); // 进入冲突段	
        DEBUGMSG( DEBUG_DEVICE_REGISTERFSD, ( "Device_RegisterFSD: GetFSD.\r\n" ) );
		if( GetFSD( lpcszFSDName ) == NULL )
		{	// 没有发现
			p->lpFSDInitDrv = (LPFSDINITDRV)(p + 1);
			p->lpszFSDName = (LPTSTR)(p->lpFSDInitDrv + 1);
			
			strcpy( p->lpszFSDName, lpcszFSDName );
			memcpy( p->lpFSDInitDrv, lpfsd, sizeof( FSDINITDRV ) );
			p->hFSDRegister = hFSDRegister;
			//p->hFsdInit = hFSD;
			p->lpNext = lpFsdList;
			p->iRefCount = 1;
			lpFsdList = p;

			LeaveCriticalSection( &csDeviceObjList ); // 离开冲突段
		    DEBUGMSG( DEBUG_DEVICE_REGISTERFSD, ( "Device_RegisterFSD: RegisterFSD(=%s) success.\r\n", lpcszFSDName ) );
		}
		else
		{   // 已经存在该文件系统,退出
		    LeaveCriticalSection( &csDeviceObjList ); // 离开冲突段
			free( p );
			p = NULL;
		}
    }
	else
	{
		WARNMSG( DEBUG_DEVICE_REGISTERFSD, ( "Device_RegisterFSD:no enough mem.\r\n" ) );
	}
    return p != NULL;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_UnregisterFSD ( LPCTSTR lpcszFSDName )
// 参数:
//		IN lpcszFSDName - 文件系统名 
// 返回值:
//		假如成功,返回TRUE。否则返回FALSE
// 功能描述:
//		注销文件系统
// 引用: 
// *****************************************************************

BOOL WINAPI Device_UnregisterFSD ( LPCTSTR lpcszFSDName )
{
    LPDEVFSD pfsd, prev;

    EnterCriticalSection( &csDeviceObjList ); // 进入冲突段	
   
	prev = pfsd = lpFsdList;
    
    while( pfsd )
    {
        if( stricmp( pfsd->lpszFSDName, lpcszFSDName ) == 0 )
        {	//发现它
			if( --pfsd->iRefCount == 0 )
			{	//假如引用数为0,则释放该对象
				if( prev == lpFsdList )
					lpFsdList = lpFsdList->lpNext;
				else
					prev->lpNext = pfsd->lpNext;
				free( pfsd );
			}
		    LeaveCriticalSection( &csDeviceObjList ); // 离开冲突段	

            return TRUE;
        }
        prev = pfsd;
        pfsd = pfsd->lpNext;
    }

    LeaveCriticalSection( &csDeviceObjList ); // 离开冲突段	
    return FALSE;
}

// *****************************************************************
// 声明:BOOL WINAPI Device_LoadFSD ( HANDLE hDevice, LPCTSTR lpcszFSDName )
// 参数:
//		IN hDevice - 设备句柄(调用RegisterDevice / RegisterDriver返回的句柄)
//		IN lpcszFSDName - 文件系统名
// 返回值:
//		假如成功,返回TRUE。否则返回FALSE
// 功能描述:
//		将一个设备与一个文件系统关联
// 引用: 
//		系统API
// *****************************************************************

#define DEBUG_DEVICE_LOADFSD 0
BOOL WINAPI Device_LoadFSD ( HANDLE hDevice, LPCTSTR lpcszFSDName )
{    
	LPDEVFSD lpfsd;
	DEVICE_DATA * lpdd;

    EnterCriticalSection( &csDeviceObjList ); // 进入冲突段	
	lpfsd = GetFSD( lpcszFSDName );
	if( lpfsd ) // 假如有该文件系统,增加其引用数
	    lpfsd->iRefCount++;
    LeaveCriticalSection( &csDeviceObjList ); // 离开冲突段	

	lpdd = _GetHDEVPtr( hDevice );
		
	if( lpfsd && lpdd )
	{   // 调用文件系统的连接功能
		lpdd->hFSDAttach = lpfsd->lpFSDInitDrv->lpAttachDevice( lpfsd->hFSDRegister, lpdd->lpszName );
		DEBUGMSG( DEBUG_DEVICE_LOADFSD, ( "Device_LoadFSD:Attach Handle=%x.\r\n", lpdd->hFSDAttach ) );
		if( lpdd->hFSDAttach )
		{	//连接成功
			lpdd->lpfsd = lpfsd;
			return TRUE;
		}
	}
	// 失败,减少其引用数
	if( lpfsd )
	    lpfsd->iRefCount--;

    return FALSE;
}

// *****************************************************************
// 声明:static BOOL _Device_LoadFSD ( DEVICE_DATA * lpdd )
// 参数:
//		IN lpdd - 设备对象指针
//		IN lpcszFSDName - 文件系统名
// 返回值:
//		假如成功,返回TRUE。否则返回FALSE
// 功能描述:
//		将一个设备与一个文件系统去掉关联
// 引用: 
//		
// *****************************************************************

#define DEBUG_DoUnloadFSD 1
static BOOL DoUnloadFSD ( DEVICE_DATA * lpdd )
{    
	BOOL bRetv = FALSE;

	DEBUGMSG( DEBUG_DoUnloadFSD, ( "DoUnloadFSD entry.\r\n." ) );
	if( lpdd  )
	{
		// 该对象是否与某文件系统关联 ?
		if( lpdd->hFSDAttach && lpdd->lpfsd )
		{	//是,通知该文件系统去注销它
			//RETAILMSG( 1, ( "Detach device.\r\n." ) );
			lpdd->lpfsd->lpFSDInitDrv->lpDetachDevice( lpdd->hFSDAttach );
			--lpdd->lpfsd->iRefCount;// 减少对该文件系统的引用
			lpdd->hFSDAttach = lpdd->lpfsd = 0;
			bRetv = TRUE;
		}
		else
		{
			WARNMSG( DEBUG_DoUnloadFSD, ( "DoUnloadFSD the device not connect to a fsd.\r\n." ) );
		}
		

		/*

        EnterCriticalSection( &csDeviceObjList ); // 进入冲突段


		lpDevOpen = (LPOBJLIST)lpDeviceOpenObjList; //全局设备打开/引用对象链表
		// 查找已打开该设备的对象,如果有则注销它
		for( ; lpDevOpen; lpDevOpen = lpDevOpen->lpNext )
		{
			if( ( (LPDEVICE_OPEN_FILE)lpDevOpen )->lpDev == lpdd )  // 
			{   // 找到该对象
				( (LPDEVICE_OPEN_FILE)lpDevOpen )->lpDev = NULL; // 不许再用
				Interlock_Decrement( (LPLONG)&lpdd->obj.iRefCount ); // 减少引用
			}
		}

		LeaveCriticalSection( &csDeviceObjList ); // 离开冲突段
		*/
	}
	DEBUGMSG( DEBUG_DoUnloadFSD, ( "DoUnloadFSD leave(ret=%d).\r\n", bRetv ) );
	return bRetv;
}


// *****************************************************************
// 声明:BOOL WINAPI Device_LoadFSD ( HANDLE hDevice, LPCTSTR lpcszFSDName )
// 参数:
//		IN hDevice - 设备句柄(调用RegisterDevice / RegisterDriver返回的句柄)
//		IN lpcszFSDName - 文件系统名
// 返回值:
//		假如成功,返回TRUE。否则返回FALSE
// 功能描述:
//		将一个设备与一个文件系统关联
// 引用: 
//		系统API
// *****************************************************************

#define DEBUG_DEVICE_UNLOADFSD 0
BOOL WINAPI Device_UnloadFSD ( HANDLE hDevice )
{    
    DEVICE_DATA * lpdd = _GetHDEVPtr( hDevice ); // 由句柄得到设备数据结构指针
	if( lpdd )
		return DoUnloadFSD( lpdd );
	return FALSE;
}

// *****************************************************************
// 声明:void DeregisterAllDevice( void )
// 参数:
//		无
// 返回值:
//		无
// 功能描述:
//		注销所有的设备
// 引用: 
// *****************************************************************
//
void DeregisterAllDevice( void )
{
	LPDEVICE_DATA lpdev;

	EnterCriticalSection( &csDeviceObjList ); // 进入冲突段	
	lpdev = (LPDEVICE_DATA)lpDeviceObjList;
	while( lpdev )
	{
		DoUnloadFSD( lpdev );
		Device_Deregister( (HANDLE)lpdev );
		lpdev = (LPDEVICE_DATA)lpDeviceObjList;
	}
	LeaveCriticalSection( &csDeviceObjList ); // 离开冲突段	
}
//

// *****************************************************************
// 声明:void _InitDllDevice( void )
// 参数:
//		无
// 返回值:
//		无
// 功能描述:
//		从注册表加载驱动程序
// 引用: 
// *****************************************************************

//在注册表里加入相关的 文件连接
//[HKEY_HARDWARE_ROOT\Drivers\BuiltIn\Serial]
//"Prefix"="XXX" //函数前缀名,参看“驱动程序接口定义”
//"Dll"="serial.so" //驱动程序文件名
//"Index"=dword:1 //当注册驱动程序时的索引号
//参看“RegisterDriver”和”RegisterDevice”

#define DEBUG_InitDllDevice 0
void _InitDllDevice( void )
{
	HKEY hSubKey;
	HKEY hDriverKey;


    if( RegOpenKeyEx( HKEY_HARDWARE_ROOT, szBuiltInKey, 0, KEY_ALL_ACCESS, &hSubKey ) == ERROR_SUCCESS )
	{
		//TCHAR filePath[MAX_PATH];
		int n = 0;

		while( 1 )
		{
//			DWORD dwType;
			TCHAR tcValueName[32];  //
			DWORD dwValueNameSize = sizeof( tcValueName );
			TCHAR tcPrefix[8];
			DWORD dwPrefixSize = sizeof( tcPrefix );
			TCHAR tcDll[MAX_PATH];
			DWORD dwDllSize = sizeof( tcDll );
			DWORD dwIndex;
			DWORD dwIndexSize = sizeof(dwIndex);
			DEBUGMSG( DEBUG_InitDllDevice, ( "_InitDllDevice: call RegEnumKeyEx(%d).\r\n", n ) );			
			if( ERROR_SUCCESS != RegEnumKeyEx( 
										hSubKey, 
										n++, 
										tcValueName, 
										&dwValueNameSize, 
										0, 
										NULL, 
										NULL, 
										NULL ) )
				break;
			if( ERROR_SUCCESS != RegOpenKeyEx( 
										hSubKey,
										tcValueName,
										0,
										KEY_ALL_ACCESS,
										&hDriverKey ) )
				continue;
			if( ERROR_SUCCESS != RegQueryValueEx( hDriverKey, szPrefix, NULL, NULL, tcPrefix, &dwPrefixSize ) )
			{
				goto _CLOSE_HKEY;
			}
			if( dwPrefixSize != 4 )
			{
				goto _CLOSE_HKEY;
			}
			if( ERROR_SUCCESS != RegQueryValueEx( hDriverKey, szDll, NULL, NULL, tcDll, &dwDllSize ) )
			{
				goto _CLOSE_HKEY;
			}
			if( ERROR_SUCCESS != RegQueryValueEx( hDriverKey, szIndex, NULL, NULL, (LPBYTE)&dwIndex, &dwIndexSize ) )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -