📄 ch365dll.c
字号:
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE );
}
BOOL WINAPI CH365mAbortWaitInt( // 放弃等待中断
ULONG iIndex ) // 指定CH365设备序号
{
ULONG mLength;
mWIN32_COMMAND mCommand;
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncAbortWaitInter; // 放弃等待中断
mCommand.mAddress = NULL;
mCommand.mLength = 0;
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE );
}
BOOL WINAPI CH365mSetIntRoutine( // 设定中断服务程序
ULONG iIndex, // 指定CH365设备序号
mPCH365_INT_ROUTINE iIntRoutine ) // 指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序
{
HANDLE mHandle = NULL;
dllIntRoutine[ iIndex ] = NULL;
while ( dllIntThreadId[ iIndex ] ) CH365mAbortWaitInt( iIndex ); // 放弃在此之前的等待中断,等待线程结束
if ( iIntRoutine == NULL ) return( TRUE ); // 取消中断服务
dllIntRoutine[ iIndex ] = iIntRoutine;
mHandle = CreateThread( NULL, 0, dllInterruptThread, NULL, 0, & dllIntThreadId[ iIndex ] ); // 创建线程模拟中断事件
if ( mHandle ) { // 线程创建成功
SetThreadPriority( mHandle, THREAD_PRIORITY_TIME_CRITICAL ); // 为了缩短中断服务程序响应时间,应该提高线程的优先级
return ( TRUE );
}
else return ( FALSE );
}
BOOL WINAPI CH365mReadIntCommand( // 读取中断命令缓冲区
ULONG iIndex, // 指定CH365设备序号
mPWIN32_COMMAND oCommand, // 指向一个足够大的缓冲区,用于保存读取的命令结构
ULONG iCmdIndex ) // 中断命令序号,为1或者2
{
ULONG mLength;
mPWIN32_COMMAND mCommand;
mLength = mMAX_COMMAND_LENGTH;
mCommand = LocalAlloc( LMEM_FIXED, mLength + mWIN32_COMMAND_HEAD ); // 分配内存
if ( mCommand != NULL ) {
mCommand -> mFunction = iCmdIndex == 1 ? mFuncReadBuffer1 : mFuncReadBuffer2; // 读取指定的中断命令缓冲区
mCommand -> mAddress = NULL;
mCommand -> mLength = mLength;
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, mCommand, mLength + mWIN32_COMMAND_HEAD, mCommand, mLength + mWIN32_COMMAND_HEAD, &mLength, NULL ) ) {
CopyMemory( oCommand, & mCommand -> mBuffer[0], mLength ); // 返回读取的中断命令
LocalFree( mCommand ); // 释放内存
return( TRUE );
}
LocalFree( mCommand ); // 释放内存
}
return( FALSE );
}
BOOL WINAPI CH365mWriteIntCommand( // 写入中断命令缓冲区
ULONG iIndex, // 指定CH365设备序号
mPWIN32_COMMAND iCommand, // 指向作为中断命令的命令结构
ULONG iCmdIndex ) // 中断命令序号,为1或者2
{
ULONG mLength;
mPWIN32_COMMAND mCommand;
mLength = min( mMAX_COMMAND_LENGTH, iCommand -> mLength + mWIN32_COMMAND_HEAD );
mCommand = LocalAlloc( LMEM_FIXED, mLength + mWIN32_COMMAND_HEAD ); // 分配内存
if ( mCommand != NULL ) {
mCommand -> mFunction = iCmdIndex == 1 ? mFuncWriteBuffer1 : mFuncWriteBuffer2; // 写入指定的中断命令缓冲区
mCommand -> mAddress = NULL;
mCommand -> mLength = mLength;
CopyMemory( & mCommand -> mBuffer[0], iCommand, mLength ); // 将中断命令作为写入的数据
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, mCommand, mLength + mWIN32_COMMAND_HEAD, mCommand, mLength + mWIN32_COMMAND_HEAD, &mLength, NULL ) ) {
LocalFree( mCommand ); // 释放内存
return( TRUE );
}
LocalFree( mCommand ); // 释放内存
}
return( FALSE );
}
BOOL WINAPI CH365mReadIoByte( // 从I/O端口读取一个字节
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定I/O端口的地址
PUCHAR oByte ) // 指向一个字节单元,用于保存读取的字节数据
{
PVOID mAddress;
ULONG mLength;
mWIN32_COMMAND mCommand;
// if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr; // 直接指定地址
if ( iAddr >= (PVOID)0x0100 ) mAddress = iAddr; // 本址定址功能的ISA兼容地址
else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr; // 只是指定偏移地址,要加上基址
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncReadIoByte; // 以字节为单位读取I/O端口
mCommand.mAddress = mAddress;
mCommand.mLength = 1;
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
*oByte = mCommand.mBuffer[0]; // 返回读取的字节数据
return( TRUE );
}
else return( FALSE );
}
BOOL WINAPI CH365mReadIoWord( // 从I/O端口读取一个字
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定I/O端口的地址
PUSHORT oWord ) // 指向一个字单元,用于保存读取的字数据
{
PVOID mAddress;
ULONG mLength;
mWIN32_COMMAND mCommand;
// if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr; // 直接指定地址
if ( iAddr >= (PVOID)0x0100 ) mAddress = iAddr; // 本址定址功能的ISA兼容地址
else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr; // 只是指定偏移地址,要加上基址
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncReadIoWord; // 以字为单位读取I/O端口
mCommand.mAddress = mAddress;
mCommand.mLength = 2;
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
*oWord = *(PUSHORT) & mCommand.mBuffer[0]; // 返回读取的字数据
return( TRUE );
}
else return( FALSE );
}
BOOL WINAPI CH365mReadIoDword( // 从I/O端口读取一个双字
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定I/O端口的地址
PULONG oDword ) // 指向一个双字单元,用于保存读取的双字数据
{
PVOID mAddress;
ULONG mLength;
mWIN32_COMMAND mCommand;
if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr; // 直接指定地址
else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr; // 只是指定偏移地址,要加上基址
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncReadIoDword; // 以双字为单位读取I/O端口
mCommand.mAddress = mAddress;
mCommand.mLength = 4;
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
*oDword = *(PULONG) & mCommand.mBuffer[0]; // 返回读取的双字数据
return( TRUE );
}
else return( FALSE );
}
BOOL WINAPI CH365mWriteIoByte( // 向I/O端口写入一个字节
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定I/O端口的地址
UCHAR iByte ) // 待写入的字节数据
{
PVOID mAddress;
ULONG mLength;
mWIN32_COMMAND mCommand;
// if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr; // 直接指定地址
if ( iAddr >= (PVOID)0x0100 ) mAddress = iAddr; // 本址定址功能的ISA兼容地址
else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr; // 只是指定偏移地址,要加上基址
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncWriteIoByte; // 以字节为单位写入I/O端口
mCommand.mAddress = mAddress;
mCommand.mLength = 1;
mCommand.mBuffer[0] = iByte; // 待写入的字节数据
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE );
}
BOOL WINAPI CH365mWriteIoWord( // 向I/O端口写入一个字
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定I/O端口的地址
USHORT iWord ) // 待写入的字数据
{
PVOID mAddress;
ULONG mLength;
mWIN32_COMMAND mCommand;
// if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr; // 直接指定地址
if ( iAddr >= (PVOID)0x0100 ) mAddress = iAddr; // 本址定址功能的ISA兼容地址
else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr; // 只是指定偏移地址,要加上基址
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncWriteIoWord; // 以字为单位写入I/O端口
mCommand.mAddress = mAddress;
mCommand.mLength = 2;
*(PUSHORT) & mCommand.mBuffer[0] = iWord; // 待写入的字数据
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE );
}
BOOL WINAPI CH365mWriteIoDword( // 向I/O端口写入一个双字
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定I/O端口的地址
ULONG iDword ) // 待写入的双字数据
{
PVOID mAddress;
ULONG mLength;
mWIN32_COMMAND mCommand;
if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr; // 直接指定地址
else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr; // 只是指定偏移地址,要加上基址
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncWriteIoDword; // 以双字为单位写入I/O端口
mCommand.mAddress = mAddress;
mCommand.mLength = 4;
*(PULONG) & mCommand.mBuffer[0] = iDword; // 待写入的双字数据
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
return( TRUE );
else return( FALSE );
}
BOOL WINAPI CH365mReadMemByte( // 从存储器读取一个字节
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定存储器的地址,虚拟地址
PUCHAR oByte ) // 指向一个字节单元,用于保存读取的字节数据
{
PVOID mAddress;
ULONG mLength;
mWIN32_COMMAND mCommand;
if ( iAddr >= (PVOID)dllMemBaseAddr[ iIndex ] ) mAddress = iAddr; // 直接指定地址
else mAddress = (PUCHAR)dllMemBaseAddr[ iIndex ] + (ULONG)iAddr; // 只是指定偏移地址,要加上基址
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncReadMemByte; // 以字节为单位读取存储器
mCommand.mAddress = mAddress;
mCommand.mLength = 1;
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
*oByte = mCommand.mBuffer[0]; // 返回读取的字节数据
return( TRUE );
}
else return( FALSE );
}
BOOL WINAPI CH365mReadMemDword( // 从存储器读取一个双字
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定存储器的地址,虚拟地址
PULONG oDword ) // 指向一个双字单元,用于保存读取的双字数据
{
PVOID mAddress;
ULONG mLength;
mWIN32_COMMAND mCommand;
if ( iAddr >= (PVOID)dllMemBaseAddr[ iIndex ] ) mAddress = iAddr; // 直接指定地址
else mAddress = (PUCHAR)dllMemBaseAddr[ iIndex ] + (ULONG)iAddr; // 只是指定偏移地址,要加上基址
mLength = sizeof( mWIN32_COMMAND );
mCommand.mFunction = mFuncReadMemDword; // 以双字为单位读取存储器
mCommand.mAddress = mAddress;
mCommand.mLength = 4;
if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
*oDword = *(PULONG) & mCommand.mBuffer[0]; // 返回读取的双字数据
return( TRUE );
}
else return( FALSE );
}
BOOL WINAPI CH365mWriteMemByte( // 向存储器写入一个字节
ULONG iIndex, // 指定CH365设备序号
PVOID iAddr, // 指定存储器的地址,虚拟地址
UCHAR iByte ) // 待写入的字节数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -