📄 easyisp1581.cpp
字号:
// EasyISP1581.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <windows.h>
#include <winbase.h>
#include "devioctl.h"
#include <setupapi.h>
#include <basetyps.h>
#include <stdio.h>
#include "EasyISP1581.h"
#include "Rwbulk.h"
#include "ioctl.h"
HANDLE m_devhandle=NULL;
HANDLE m_pipehandle=NULL;
int m_pipenum;
/*******************************************************
入口参数:
无
函数功能:查找并初始化USB
*******************************************************/
int __stdcall ISP1581_Init()
{
return init();
}
/*******************************************************
入口参数:
无
函数功能:打开USB设备
*******************************************************/
HANDLE __stdcall ISP1581_OpenDev()
{
m_devhandle=open_dev();
return m_devhandle;
}
/*******************************************************
入口参数:
pipename:存储USB管道名称
函数功能:打开所要操作的USB管道,要对USB进行读写操作之前,
必须要先打开所要进行操作的管道。
注:
"PIPE00","PIPE02"为读取数据管道
"PIPE01","PIPE03"为写入数据管道
"PIPE00","PIPE01"属于端点1
"PIPE02","PIPE03"属于端点2
*******************************************************/
HANDLE __stdcall ISP1581_OpenPipe(char *pipename)
{
return open_file_os(pipename);
}
/*******************************************************
入口参数:
无
函数功能:关闭USB设备
*******************************************************/
int __stdcall ISP1581_CloseDev(HANDLE devhandle)
{
CloseHandle(devhandle);
return 0;
}
/*******************************************************
入口参数:
无
函数功能:关闭已经打开的管道
*******************************************************/
int __stdcall ISP1581_ClosePipe(HANDLE pipehandle)
{
CloseHandle(pipehandle);
return 0;
}
/*******************************************************
入口参数:
无
函数功能:重启管道
*******************************************************/
void ResetPipe(HANDLE pipehandle)
{
DWORD nbytes,lasterror=0;
OVERLAPPED os;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
if(!DeviceIoControl(pipehandle,
IOCTL_1581_RESET_PIPE,
0,0,0,0,&nbytes,&os))
{
if((lasterror=::GetLastError())==ERROR_IO_PENDING)
{
switch(::WaitForSingleObject(os.hEvent,1000))
{
case WAIT_OBJECT_0:
if(!::GetOverlappedResult(pipehandle,&os,&nbytes,FALSE))
{
lasterror=::GetLastError();
}
else
lasterror=0;
break;
case WAIT_TIMEOUT:
::CancelIo(pipehandle);
lasterror=ERROR_TIMEOUT;
break;
default:
lasterror=::GetLastError();
break;
}
}
}
CloseHandle(os.hEvent);
}
/*******************************************************
入口参数:
pipehandle: 所要操作并且已经打开的管道句柄
recbuffer:接收数据缓冲区
bufferlen:接收数据缓冲区长度,必须为实际所要接收的数据长度
waittiem:等待超时时间,为-1表示一直等待
函数功能:从USB设备读取数据,在调用此函数之前必须确保USB设
备和所要操作的管道已经打开
*******************************************************/
int __stdcall ISP1581_Read(HANDLE pipehandle,unsigned char *recbuffer,int bufferlen,int waittime)
{
DWORD nbytes=0,lasterror=0;
OVERLAPPED os;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
if(!ReadFile(pipehandle,recbuffer,bufferlen,&nbytes,&os))
{
if((lasterror=::GetLastError())==ERROR_IO_PENDING)
{
switch(::WaitForSingleObject(os.hEvent,(DWORD)waittime))
{
case WAIT_OBJECT_0:
if(!::GetOverlappedResult(pipehandle,&os,&nbytes,FALSE))
{
lasterror=::GetLastError();
}
else
lasterror=0;
break;
case WAIT_TIMEOUT:
::CancelIo(pipehandle);
lasterror=ERROR_TIMEOUT;
break;
default:
lasterror=::GetLastError();
break;
}
}
}
CloseHandle(os.hEvent);
if(lasterror!=0)
{
ResetPipe(pipehandle);
}
if(lasterror!=0)
return -1;
return nbytes;
}
/*******************************************************
入口参数:
pipehandle: 所要操作并且已经打开的管道句柄
sendbuffer:发送数据缓冲区
bufferlen:发送数据缓冲区长度,必须为实际所要发送的数据长度
waittiem:等待超时时间,为-1表示一直等待
函数功能:向USB设备写入数据,在调用此函数之前必须确保USB设
备和所要操作的管道已经打开
*******************************************************/
int __stdcall ISP1581_Write(HANDLE pipehandle,unsigned char *sendbuffer,int bufferlen,int waittime)
{
DWORD nbytes=0,lasterror=0;
int i=0;
int tmpbufferlen=bufferlen;
OVERLAPPED os;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
if(!WriteFile(pipehandle,&sendbuffer[i],bufferlen,&nbytes,&os))
{
if((lasterror=::GetLastError())==ERROR_IO_PENDING)
{
switch(::WaitForSingleObject(os.hEvent,(DWORD)waittime))
{
case WAIT_OBJECT_0:
if(!::GetOverlappedResult(pipehandle,&os,&nbytes,FALSE))
{
lasterror=::GetLastError();
}
else
lasterror=0;
break;
case WAIT_TIMEOUT:
::CancelIo(pipehandle);
lasterror=ERROR_TIMEOUT;
break;
default:
lasterror=::GetLastError();
break;
}
}
}
if(lasterror!=0)
{
ResetPipe(pipehandle);
}
CloseHandle(os.hEvent);
if(lasterror!=0)
return -1;
return nbytes;
}
/*******************************************************
入口参数:
devhandle: 所要操作并且已经打开的设备句柄
code:控制代码,为1表示以扫描仪方式读取数据,为0表示以打印机方式写入数据
length:此长度指的是马上要进行的读写操作的缓冲区的长度
函数功能:发送厂商请求,请求以打印机方式写入数据或以扫描仪方式读取数据
*******************************************************/
int __stdcall ISP1581_Vender_ScanOrPrint(HANDLE devhandle,unsigned char code,int length)
{
IO_BLOCK ioBlock;
IO_REQUEST ioRequest;
DWORD nbytes,lasterror=0;
OVERLAPPED os;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
ioRequest.uAddressL = 0;
ioRequest.bAddressH = 0;
ioRequest.uSize = length;
ioRequest.bCommand = code;
ioBlock.uOffset = 0;
ioBlock.uLength = sizeof(IO_REQUEST);
ioBlock.pbyData = (PUCHAR)&ioRequest;
ioBlock.uIndex = SETUP_DMA_REQUEST;
if(!DeviceIoControl(devhandle,
IOCTL_WRITE_REGISTERS,
(PVOID)&ioBlock,sizeof(IO_BLOCK),0,0,&nbytes,&os))
{
if((lasterror=::GetLastError())==ERROR_IO_PENDING)
{
switch(::WaitForSingleObject(os.hEvent,1000))
{
case WAIT_OBJECT_0:
if(!::GetOverlappedResult(devhandle,&os,&nbytes,FALSE))
{
lasterror=::GetLastError();
}
else
lasterror=0;
break;
case WAIT_TIMEOUT:
::CancelIo(devhandle);
lasterror=ERROR_TIMEOUT;
break;
default:
lasterror=::GetLastError();
break;
}
}
}
CloseHandle(os.hEvent);
if(lasterror==0)
return lasterror;
return -1;
}
/*******************************************************
入口参数:
devhandle: 所要操作并且已经打开的设备句柄
code:控制代码,为1表示从E2PROM读取数据,为0表示向E2PROM写入数据
offset:为所要进行操作的E2PROM起始地址
length:此长度指的是马上要进行的读写操作的缓冲区的长度
函数功能:发送厂商请求,请求对E2PROM进行操作
*******************************************************/
int __stdcall ISP1581_Vender_E2prom(HANDLE devhandle,unsigned char code,unsigned char offset,int length)
{
IO_BLOCK ioBlock;
IO_REQUEST ioRequest;
DWORD nbytes,lasterror=0;
OVERLAPPED os;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
ioRequest.uAddressL = 0;
ioRequest.bAddressH = 0;
ioRequest.uSize = length;
ioRequest.bCommand = code;
ioBlock.uOffset = offset;
ioBlock.uLength = sizeof(IO_REQUEST);
ioBlock.pbyData = (PUCHAR)&ioRequest;
ioBlock.uIndex = SETUP_E2PROM_REQUEST;
if(!DeviceIoControl(devhandle,
IOCTL_WRITE_REGISTERS,
(PVOID)&ioBlock,sizeof(IO_BLOCK),0,0,&nbytes,&os))
{
if((lasterror=::GetLastError())==ERROR_IO_PENDING)
{
switch(::WaitForSingleObject(os.hEvent,1000))
{
case WAIT_OBJECT_0:
if(!::GetOverlappedResult(devhandle,&os,&nbytes,FALSE))
{
lasterror=::GetLastError();
}
else
lasterror=0;
break;
case WAIT_TIMEOUT:
::CancelIo(devhandle);
lasterror=ERROR_TIMEOUT;
break;
default:
lasterror=::GetLastError();
break;
}
}
}
CloseHandle(os.hEvent);
if(lasterror==0)
return lasterror;
return -1;
}
/*******************************************************
入口参数:
devhandle: 所要操作并且已经打开的设备句柄
version: 版本号
函数功能:厂商请求读取,此函数的功能为读取版本号
*******************************************************/
int __stdcall ISP1581_Vender_Read(HANDLE devhandle,unsigned char &version)
{
DWORD nbytes,lasterror=0;
OVERLAPPED os;
memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=::CreateEvent(NULL,TRUE,FALSE,NULL);
IO_BLOCK ioBlock;
ioBlock.uOffset = 0;
ioBlock.uLength = 1;
ioBlock.pbyData = (PUCHAR)&version;
ioBlock.uIndex = GET_FIRMWARE_VERSION;
if(!DeviceIoControl(devhandle,
IOCTL_READ_REGISTERS,
(PVOID)&ioBlock,sizeof(IO_BLOCK),(PVOID)&version,1,&nbytes,&os))
{
if((lasterror=::GetLastError())==ERROR_IO_PENDING)
{
switch(::WaitForSingleObject(os.hEvent,1000))
{
case WAIT_OBJECT_0:
if(!::GetOverlappedResult(devhandle,&os,&nbytes,FALSE))
{
lasterror=::GetLastError();
}
else
lasterror=0;
break;
case WAIT_TIMEOUT:
::CancelIo(devhandle);
lasterror=ERROR_TIMEOUT;
break;
default:
lasterror=::GetLastError();
break;
}
}
}
CloseHandle(os.hEvent);
if(lasterror==0)
return lasterror;
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -