📄 device.c
字号:
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 + -