www.pudn.com > DNW0-50A.rar > USBTXRX.CPP


#define STRICT 
#define WIN32_LEAN_AND_MEAN 
 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
//#include  
//#include  
//#include  
 
#include "resource.h" 
 
#include "def.h" 
#include "dnw.h" 
#include "engine.h" 
#include "fileopen.h" 
#include "d_box.h" 
 
#include "rwbulk.h" 
 
/*  
   To compile rwbulk.c, the followings should be added. 
   1. linker option: usbd.lib,setupapi.lib  
   2. additional library path: C:\NTDDK\libfre\i386 
   3. additional include directories: C:\NTDDK\inc 
   4. copy bulkusb.h,guid829.h from bulkusb directory. 
*/ 
 
HANDLE hWrite = INVALID_HANDLE_VALUE; 
HANDLE hRead = INVALID_HANDLE_VALUE; 
 
static volatile char *txBuf; 
static volatile DWORD iTxBuf; 
static DWORD txBufSize; 
 
DWORD downloadAddress; 
TCHAR szDownloadAddress[16]; 
 
 
void UsbTxFile(void *args); 
 
 
void MenuUsbStatus(HWND hwnd) 
{ 
    dumpUsbConfig(); 
} 
 
 
void MenuUsbTransmit(HWND hwnd) 
{ 
    ULONG i; 
    HANDLE hFile; 
    ULONG fileSize; 
    USHORT cs=0; 
    BOOL result; 
    unsigned long threadResult; 
 
    hWrite = open_file( outPipe); 
     
    if(hWrite==INVALID_HANDLE_VALUE) 
    { 
	MessageBox(hwnd,TEXT("Can't open USB device.\n"),TEXT("Error"), 
		   MB_OK | MB_ICONINFORMATION ); 
	return; 
    } 
     
    result=PopFileOpenDlg(hwnd,szFileName,szTitleName); 
     
    if(result==0) //file open fail 
    { 
	CloseHandle(hWrite); 
	return; 
    } 
 
    hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); 
    if(hFile==INVALID_HANDLE_VALUE) 
    { 
	EB_Printf(TEXT("[ERROR:File Open]\n") ); 
	return; 
    } 
     
    fileSize=GetFileSize(hFile,NULL); 
 
    txBuf=(char *)malloc(fileSize+10);  
    if(txBuf==0) 
    { 
	EB_Printf(TEXT("[ERROR:Memory Allocation Fail:(%d)]\n"),fileSize+6 ); 
	return; 
    } 
 
    ReadFile(hFile,(void *)(txBuf+8),fileSize,&txBufSize,NULL); 
    if(txBufSize!=fileSize)     
    { 
    	EB_Printf(TEXT("[ERROR:File Size Error]\n") ); 
	return; 
    } 
 
    *((DWORD *)txBuf+0)=downloadAddress; 
    *((DWORD *)txBuf+1)=fileSize+10;   //attach filesize(n+6+4)  
    for(i=8;i<(fileSize+8);i++) 
	cs+=(BYTE)(txBuf[i]); 
    *((WORD *)(txBuf+8+fileSize))=cs;   //attach checksum  
     
    txBufSize+=10; 
    iTxBuf=0; 
 
    CloseHandle(hFile); 
     
    threadResult=_beginthread( (void (*)(void *))UsbTxFile,0x2000,(void *)0); 
     
    if(threadResult!=-1) 
    { 
	//Create the download progress dialogbox. 
	CreateDialog(_hInstance,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,DownloadProgressProc); //modaless 
	//ShowWindow(_hDlgDownloadProgress,SW_SHOW);  
    	//isn't needed because the dialog box already has WS_VISIBLE attribute. 
    } 
    else 
    { 
	EB_Printf("[ERROR:Can't creat a thread. Memory is not sufficient]\n"); 
    } 
 
    //The dialog box will be closed at the end of TxFile(). 
    //free(txBuf) & CloseHandle(hWrite) will be done in TxFile() 
} 
 
#define USB_OVERLAPPED_IO FALSE  //should be FALSE becasue USB overlapped IO doesn't work well. 
 
#define TX_SIZE (4096*4)  
 
VOID CALLBACK UsbWriteCompleteRoutine(DWORD dwErrorCode,DWORD dwNumberOfBytesTransfered, 
	                              LPOVERLAPPED lpOverlapped) 
{ 
    //nothing to do 
} 
 
void UsbTxFile(void *args) 
{ 
    void *txBlk; 
    ULONG txBlkSize; 
    DWORD nBytesWrite; 
    DWORD txBufSize100; 
    DWORD temp; 
    DWORD count; 
 
#if USB_OVERLAPPED_IO 
    //NOTE: hWrite should have FILE_FLAG_OVERLAPPED attribute. 
    OVERLAPPED os; 
    memset(&os,0,sizeof(OVERLAPPED)); 
 
    os.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); 
    if(os.hEvent==NULL) 
    { 
	EB_Printf(TEXT("[ERROR:DoRxTx os.hEvent]\n")); 
        free((void *)txBuf); 
        CloseHandle(hWrite);     
	_endthread(); 
    } 
#endif 
        
    InitDownloadProgress(); 
 
    txBufSize100=txBufSize/100; 
    if(txBufSize100==0)txBufSize100=1; 
    while(1) 
    { 
        if((txBufSize-iTxBuf) > TX_SIZE) 
	    txBlkSize=TX_SIZE; 
	else 
	    txBlkSize=txBufSize-iTxBuf; 
	 
	txBlk=(void *)(txBuf+iTxBuf); 
    #if USB_OVERLAPPED_IO 
	WriteFile(hWrite,txBlk,txBlkSize,&nBytesWrite,&os); 
        //... 
	GetOverlappedResult(hWrite,&os,&temp,FALSE); 	 
	//...    
	//Why doesn't work GetOverlappedResult(). 
	//It may seem that secbulk.sys doesn't support OverlappedIO. 
    #else 
	WriteFile(hWrite,txBlk,txBlkSize,&nBytesWrite,NULL); 
    #endif 
 
	//assert(nBytesWrite == WriteLen); 
 
	iTxBuf+=TX_SIZE; 
	 
	if( ((iTxBuf/txBufSize100)%2)==1 ) 
	    DisplayDownloadProgress(iTxBuf/txBufSize100); 
	 
	if(downloadCanceled==1)break;	//download is canceled by user. 
 
	if(iTxBuf>=txBufSize)break; 
    } 
 
    CloseDownloadProgress(); 
 
    free((void *)txBuf); 
 
    CloseHandle(hWrite);     
 
#if USB_OVERLAPPED_IO     
    CloseHandle(os);     
#endif 
 
    _endthread(); 
} 
 
 
 
 
void MenuUsbReceive(HWND hwnd) 
{ 
/*  int nBytesRead, nBytes; 
    ULONG i, j;     
    UINT success; 
 
 
    if (fRead) 
    { 
	//ReadLen=64; 
        hRead = open_file( inPipe); 
	pinBuf = malloc(ReadLen); 
 
        if (pinBuf)  
	{ 
	    success = ReadFile(hRead, 
	    	              pinBuf, 
                              ReadLen, 
	                      &nBytesRead, 
	                      NULL); 
            printf("<%s> R (%04.4d) : request %06.6d bytes -- %06.6d bytes read\n", 
                    inPipe, i, ReadLen, nBytesRead); 
        } 
	if (pinBuf) 
	{ 
	    free(pinBuf); 
	} 
		 
	// close devices if needed 
	if(hRead != INVALID_HANDLE_VALUE) 
	    CloseHandle(hRead); 
    } 
*/ 
 
     
    ULONG i;     
    UINT success; 
    UINT rxLength=128; 
    ULONG nBytesRead; 
    char *rxBuf; 
 
    rxBuf = (char *)malloc(rxLength); 
    if(rxBuf==NULL)return;  
 
    EB_Printf("=============== USB Receive Test ==============\n"); 
 
    hRead = open_file(inPipe); 
 
    success = ReadFile(hRead, 
     	               rxBuf, 
                       rxLength, 
	               &nBytesRead, 
	               NULL); 
    if(success) 
    { 
	for(i=0;i