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

📄 usbtxrx.cpp

📁 samsung debug tool DNW 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <tchar.h>
#include <string.h>
#include <process.h>
#include <stdlib.h>
//#include <conio.h>
//#include <stdio.h>
//#include <assert.h>

#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.
*/
#define MAX_FILE_NUM	32
#define MAX_PATH        260

HANDLE hWrite = INVALID_HANDLE_VALUE;
HANDLE hRead = INVALID_HANDLE_VALUE;

static volatile char *txBuf;
static volatile DWORD iTxBuf;
static DWORD txBufSize;
static DWORD fileBufSize;

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,szEBOOTFileName,szEBOOTTitleName);
	memcpy(szFileName, szEBOOTFileName, 256);
	memcpy(szTitleName, szEBOOTTitleName, 256);
    
    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()
}

void MenuUBOOT(HWND hwnd)
{
    ULONG i, j;
    HANDLE hFile;
    HANDLE hOutFile;
	HANDLE hBinFile[MAX_FILE_NUM];
	char * szBinFileName[MAX_FILE_NUM];
	char * szBinFileFullName[MAX_FILE_NUM];
	char * szOutFileName;

    ULONG fileSize;
    USHORT cs=0;
    BOOL result;
    unsigned long threadResult;
	TCHAR	szTempFileName[3];
	ULONG nFileNumber;
	unsigned int nCheckSum = 0;
	volatile char * ptxBuf;

	char *lstFileBuf;
	DWORD lstFileBufSize;
   
	TCHAR szDirName[256];

    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,szUBOOTFileName,szUBOOTTitleName);
	memcpy(szFileName, szUBOOTFileName, 256);
	memcpy(szTitleName, szUBOOTTitleName, 256);

	strncpy ( szDirName, szFileName, strlen(szFileName) - strlen(szTitleName) );
	szDirName[strlen(szFileName) - strlen(szTitleName)] = 0;
    
    if(result==0) //file open fail
    {
		CloseHandle(hWrite);
		return;
    }

	szTempFileName[0] = szFileName[strlen(szFileName)-3];
	szTempFileName[1] = szFileName[strlen(szFileName)-2];
	szTempFileName[2] = szFileName[strlen(szFileName)-1];
	if ( !strncmp(szTempFileName,_T("lst"),3) )
	{
		hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
		if(hFile==INVALID_HANDLE_VALUE)
		{
			EB_Printf(TEXT("[ERROR:File Open](%s)\n"), szFileName );
			return;
		}
		fileSize=GetFileSize(hFile,NULL);

		lstFileBuf=(char *)malloc(fileSize+1);
		if(lstFileBuf==0)
		{
			EB_Printf(TEXT("[ERROR:Memory Allocation Fail:(%d)]\n"),fileSize);
			return;
		}

		// Read chain.lst file
		ReadFile(hFile,(void *)(lstFileBuf),fileSize,&lstFileBufSize,NULL);
		lstFileBuf[lstFileBufSize] = 0;
		CloseHandle(hFile);

		szBinFileName[0] = strtok(lstFileBuf, "\t\r\n+");
		szBinFileFullName[0] = (char *)malloc(strlen(szDirName)+strlen(szBinFileName[0])+1);
		strcpy(szBinFileFullName[0], szDirName);
		strcat(szBinFileFullName[0], szBinFileName[0]);
		for ( nFileNumber = 1; nFileNumber < MAX_FILE_NUM; nFileNumber++ )
		{
			szBinFileName[nFileNumber] = strtok(NULL, "\r\n+");
			if ( szBinFileName[nFileNumber] == NULL ) break;
			szBinFileFullName[nFileNumber] = (char *)malloc(strlen(szDirName)+strlen(szBinFileName[nFileNumber])+1);
			strcpy(szBinFileFullName[nFileNumber], szDirName);
			strcat(szBinFileFullName[nFileNumber], szBinFileName[nFileNumber]);
		}

		iTxBuf=0;
		
		txBufSize = 7 /* X000FF\n */
					+ 4 /* check sum */
					+ 4 /* num Regions */
					+ nFileNumber*8; /* start address + length */

		for ( i = 0; i < nFileNumber; i ++ )
		{
			hBinFile[i] = CreateFile(szBinFileFullName[i],GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
			if(hBinFile[i] == INVALID_HANDLE_VALUE)
			{
				EB_Printf(TEXT("[ERROR:File Open](%s)\n"), szBinFileFullName[i] );
				return;
			}
			txBufSize += GetFileSize(hBinFile[i],NULL);
		}
		txBuf=(char *)malloc(txBufSize);

		*((BYTE *)txBuf+0)=0x58;
		*((BYTE *)txBuf+1)=0x30;
		*((BYTE *)txBuf+2)=0x30;
		*((BYTE *)txBuf+3)=0x30;
		*((BYTE *)txBuf+4)=0x46;
		*((BYTE *)txBuf+5)=0x46;
		*((BYTE *)txBuf+6)=0xa;

		ptxBuf = txBuf  + 7 /* X000FF\n */
						+ 4 /* check sum */
						+ 4 /* num Regions */
						+ nFileNumber*8; /* start address + length */

		for ( i = 0; i < nFileNumber; i++ )
		{
			fileSize = GetFileSize(hBinFile[i],NULL);
			ReadFile(hBinFile[i],(void *)(ptxBuf),fileSize,&fileBufSize,NULL);
			if(fileBufSize!=fileSize)    
			{
    			EB_Printf(TEXT("[ERROR:File Size Error]\n") );
				return;
			}

			for ( j = 0; j < 8; j++ )
			{
				*((BYTE *)txBuf+15+(i*8+j))=(BYTE)(ptxBuf[7+j]);
				nCheckSum += (BYTE)(ptxBuf[7+j]);
			}
			ptxBuf += fileSize;

			CloseHandle(hBinFile[i]);
		}

		ptxBuf = txBuf + 7;

		*((DWORD *)ptxBuf+0)=nCheckSum;   //checksum
		*((DWORD *)ptxBuf+1)=nFileNumber;   //checksum

		szOutFileName = (char *)malloc(255);
		strcpy(szOutFileName, szDirName);
		strcat(szOutFileName, TEXT("ubootimage.ubi"));

		hOutFile = CreateFile(szOutFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
		WriteFile(hOutFile, (void *)(txBuf), txBufSize, &fileBufSize,NULL);
		CloseHandle(hOutFile);

		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");
		}
	}
	else if ( !strncmp(szTempFileName,_T("ubi"),3) )
	{
		hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
		if(hFile==INVALID_HANDLE_VALUE)
		{
			EB_Printf(TEXT("[ERROR:File Open](%s)\n"), szFileName );
			return;
		}
		fileSize=GetFileSize(hFile,NULL);

		txBuf=(char *)malloc(fileSize);

		if(txBuf==0)
		{
			EB_Printf(TEXT("[ERROR:Memory Allocation Fail:(%d)]\n"),fileSize);
			return;
		}

		// Read ubootimag.ubi file
		ReadFile(hFile,(void *)(txBuf),fileSize,&txBufSize,NULL);
		if(txBufSize!=fileSize)
		{
    		EB_Printf(TEXT("[ERROR:File Size Error]\n") );
			return;
		}
		CloseHandle(hFile);

		iTxBuf=0;

		threadResult=_beginthread( (void (*)(void *))UsbTxFile,0x2000,(void *)0);
	    
		if(threadResult!=-1)
		{

⌨️ 快捷键说明

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