This commit is contained in:
Triss 2021-06-22 04:13:35 +02:00
commit 3ffb3d9344
6 changed files with 385 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
dumpee
libftfake.so
ftd2xx.h
WinTypes.h

7
Makefile Normal file
View File

@ -0,0 +1,7 @@
all: libftfake.so dumpee
libftfake.so: libftfake.c
gcc -shared -fPIC -o "$@" "$<" -I. -ldl -Wall
dumpee: dumpee.c
gcc -o "$@" "$<" -L../build/ -I. -lftd2xx -Wl,-rpath=../build

152
dumpee.c Normal file
View File

@ -0,0 +1,152 @@
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "ftd2xx.h"
int main(int argc, char* argv[]) {
FT_STATUS stat;
FT_HANDLE ft;
int rv;
FT_SetVIDPID(0x0403, 0x7fd0);
stat = FT_Open(0, &ft);
if (stat) {printf("FT_Open failed\n");return 1;}
FT_DEVICE dev;
static const char* devlut[] = {
"BM","AM","100ax","unk","2232c","232r","2232h","4232h","232h",
"X-series","4222h0", "4222h12","4222h3","4222prog"};
stat = FT_GetDeviceInfo(ft, &dev, NULL, NULL, NULL, NULL);
if (stat) {printf("getdevinfo failed\n");rv=1;goto finish;}
printf("dev=%d %s\n", dev, devlut[dev]);
static FT_PROGRAM_DATA pdata;
// "MUST set signature1 and signature2 before calling FF_EE_Read"
pdata.Signature1 = 0;
pdata.Signature2 = 0xffffffff;
pdata.Manufacturer = malloc(256);
pdata.ManufacturerId = malloc(256);
pdata.Description = malloc(256);
pdata.SerialNumber = malloc(256);
stat = FT_EE_Read(ft, &pdata);
if (stat){printf("FT_EE_Read failed\n");rv=1;goto finish;}
printf("Signature1 = 0x%08x\n", pdata.Signature1);
printf("Signature2 = 0x%08x\n", pdata.Signature2);
printf("Version = %04x\n", pdata.Version);
printf("VendorId = 0x%04x\n", pdata.VendorId);
printf("ProductId = 0x%04x\n", pdata.ProductId);
printf("Manufacturer = %s\n", pdata.Manufacturer);
printf("ManufacturerId = %s\n", pdata.ManufacturerId);
printf("Description = %s\n", pdata.Description);
printf("SerialNumber = %s\n", pdata.SerialNumber);
printf("MaxPower = %d\n", pdata.MaxPower);
printf("PnP = %d\n", pdata.PnP);
printf("SelfPowered = %d\n", pdata.SelfPowered);
printf("RemoteWakeup = %d\n", pdata.RemoteWakeup);
if (dev== FT_DEVICE_BM)
{
/* Rev4 (FT232B) extensions */
printf("BM:\n");
printf("---\n");
printf("\tRev4 = 0x%X\n", pdata.Rev4);
printf("\tIsoIn = 0x%X\n", pdata.IsoIn);
printf("\tIsoOut = 0x%X\n", pdata.IsoOut);
printf("\tPullDownEnable = 0x%X\n", pdata.PullDownEnable);
printf("\tSerNumEnable = 0x%X\n", pdata.SerNumEnable);
printf("\tUSBVersionEnable = 0x%X\n", pdata.USBVersionEnable);
printf("\tUSBVersion = 0x%X\n", pdata.USBVersion);
}
if (dev== FT_DEVICE_2232C)
{
/* Rev 5 (FT2232C) extensions */
printf("2232RC:\n");
printf("-------\n");
printf("\tRev5 = 0x%X\n", pdata.Rev5);
printf("\tIsoInA = 0x%X\n", pdata.IsoInA);
printf("\tIsoInB = 0x%X\n", pdata.IsoInB);
printf("\tIsoOutA = 0x%X\n", pdata.IsoOutA);
printf("\tIsoOutB = 0x%X\n", pdata.IsoOutB);
printf("\tPullDownEnable5 = 0x%X\n", pdata.PullDownEnable5);
printf("\tSerNumEnable5 = 0x%X\n", pdata.SerNumEnable5);
printf("\tUSBVersionEnable5 = 0x%X\n", pdata.USBVersionEnable5);
printf("\tUSBVersion5 = 0x%X\n", pdata.USBVersion5);
printf("\tAIsHighCurrent = 0x%X\n", pdata.AIsHighCurrent);
printf("\tBIsHighCurrent = 0x%X\n", pdata.BIsHighCurrent);
printf("\tIFAIsFifo = 0x%X\n", pdata.IFAIsFifo);
printf("\tIFAIsFifoTar = 0x%X\n", pdata.IFAIsFifoTar);
printf("\tIFAIsFastSer = 0x%X\n", pdata.IFAIsFastSer);
printf("\tAIsVCP = 0x%X\n", pdata.AIsVCP);
printf("\tIFBIsFifo = 0x%X\n", pdata.IFBIsFifo);
printf("\tIFBIsFifoTar = 0x%X\n", pdata.IFBIsFifoTar);
printf("\tIFBIsFastSer = 0x%X\n", pdata.IFBIsFastSer);
printf("\tBIsVCP = 0x%X\n", pdata.BIsVCP);
}
if (dev== FT_DEVICE_232R)
{
/* Rev 6 (FT232R) extensions */
printf("232R:\n");
printf("-----\n");
printf("\tUseExtOsc = 0x%X\n", pdata.UseExtOsc); // Use External Oscillator
printf("\tHighDriveIOs = 0x%X\n", pdata.HighDriveIOs); // High Drive I/Os
printf("\tEndpointSize = 0x%X\n", pdata.EndpointSize); // Endpoint size
printf("\tPullDownEnableR = 0x%X\n", pdata.PullDownEnableR); // non-zero if pull down enabled
printf("\tSerNumEnableR = 0x%X\n", pdata.SerNumEnableR); // non-zero if serial number to be used
printf("\tInvertTXD = 0x%X\n", pdata.InvertTXD); // non-zero if invert TXD
printf("\tInvertRXD = 0x%X\n", pdata.InvertRXD); // non-zero if invert RXD
printf("\tInvertRTS = 0x%X\n", pdata.InvertRTS); // non-zero if invert RTS
printf("\tInvertCTS = 0x%X\n", pdata.InvertCTS); // non-zero if invert CTS
printf("\tInvertDTR = 0x%X\n", pdata.InvertDTR); // non-zero if invert DTR
printf("\tInvertDSR = 0x%X\n", pdata.InvertDSR); // non-zero if invert DSR
printf("\tInvertDCD = 0x%X\n", pdata.InvertDCD); // non-zero if invert DCD
printf("\tInvertRI = 0x%X\n", pdata.InvertRI); // non-zero if invert RI
printf("\tCbus0 = 0x%X\n", pdata.Cbus0); // Cbus Mux control
printf("\tCbus1 = 0x%X\n", pdata.Cbus1); // Cbus Mux control
printf("\tCbus2 = 0x%X\n", pdata.Cbus2); // Cbus Mux control
printf("\tCbus3 = 0x%X\n", pdata.Cbus3); // Cbus Mux control
printf("\tCbus4 = 0x%X\n", pdata.Cbus4); // Cbus Mux control
printf("\tRIsD2XX = 0x%X\n", pdata.RIsD2XX); // non-zero if using D2XX
}
uint32_t uasz, uard;
stat = FT_EE_UASize(ft, &uasz);
if (stat) {printf("FT_EE_UASize failed\n");rv=1;goto finish;}
printf("UASize = 0x%x\n", uasz);
uint8_t* data = (uint8_t*)malloc(uasz);
stat = FT_EE_UARead(ft, data, uasz, &uard);
if (stat) {printf("FT_EE_UARead failed\n");rv=1;goto finish;}
if (uasz != uard){printf("FT_EE_UARead bad len\n");rv=1;goto finish;}
FILE* f = fopen("ua.bin", "wb+");
fwrite(data, 1, uasz, f);
fclose(f);
f = fopen("ee.bin", "wb+");
for (size_t i = 0; ; ++i) {
uint16_t val;
stat = FT_ReadEE(ft, (uint32_t)i, &val);
if (stat) {printf("FT_ReadEE failed at i=%zu (%zu bytes)\n", i, i<<1); break;}
fwrite(&val, 2, 1, f);
}
fclose(f);
finish:
FT_Close(ft);
return rv;
}

BIN
ee.bin Normal file

Binary file not shown.

222
libftfake.c Normal file
View File

@ -0,0 +1,222 @@
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <dlfcn.h>
#include "ftd2xx.h"
static void* libftd2xx;
static void lib_open(void) {
static bool opened = false;
if (!opened) {
libftd2xx = dlopen("build/libftd2xx.so.1.4.8", RTLD_LAZY);
opened = libftd2xx != NULL;
if (!opened) {
printf("cant open lib!\n");
}
}
}
/*
FT_Close
FT_GetBitMode
FT_GetQueueStatus
FT_ListDevices
FT_Open
FT_OpenEx
FT_Read
FT_SetBitMode
FT_SetLatencyTimer
FT_SetTimeouts
FT_SetUSBParameters
FT_SetVIDPID
FT_Write
FT_ReadEE
FT_WriteEE
FT_EE_Program
FT_EE_Read
FT_EE_UARead
FT_EE_UAWrite
*/
#define bind(rt, fntyp, ...) \
rt rv = ({ \
static rt (* fn) fntyp = NULL; \
if (fn == NULL) { lib_open(); fn = (rt(*)fntyp)dlsym(libftd2xx, __func__); } \
fn(__VA_ARGS__); \
}) \
/*FT_STATUS FT_GetDeviceInfo(FT_HANDLE ftHandle, FT_DEVICE* ftDevice,
LPDWORD lpdwID, PCHAR serialNumber, PCHAR descr, LPVOID dummy) {
FT_STATUS rv = bind(FT_STATUS, (FT_HANDLE, FT_DEVICE*, LPDWORD, PCHAR, PCHAR, LPVOID),
ftHandle, ftDevice, lpdwID, serialNumber, descr, dummy);
printf("FT_GetDeviceInfo(%p, &%d, &0x%x, %s, %s, %p) = %d\n",
ftHandle, *ftDevice, *lpdwID, serialNumber, descr, dummy, rv);
}*/
FT_STATUS FT_Close(FT_HANDLE ftHandle) {
bind(FT_STATUS, (FT_HANDLE), ftHandle);
printf("FT_Close(%p) = %d\n", ftHandle, rv);
return rv;
}
FT_STATUS FT_GetBitMode(FT_HANDLE ftHandle, PUCHAR pucMode) {
bind(FT_STATUS, (FT_HANDLE, PUCHAR), ftHandle, pucMode);
printf("FT_GetBitMode(%p, &0x%02x) = %d\n", ftHandle, *pucMode, rv);
return rv;
}
FT_STATUS FT_GetQueueStatus(FT_HANDLE ftHandle, DWORD* dwRxBytes) {
bind(FT_STATUS, (FT_HANDLE, DWORD*), ftHandle, dwRxBytes);
// responsible for lots of spam
//printf("FT_GetSqueueStatus(%p, &0x%x) = %d\n", ftHandle, *dwRxBytes, rv);
return rv;
}
FT_STATUS FT_ListDevices(PVOID pArg1, PVOID pArg2, DWORD flags) {
bind(FT_STATUS, (PVOID, PVOID, DWORD), pArg1, pArg2, flags);
return rv;
// possible usages:
// * fn(nulterm array to strings, &numdevs, FT_LIST_ALL | FT_OPEN_BY_SERIAL_NUMBER)
// * fn(null??, charbuf, FT_LIST_BY_INDEX | FT_OPEN_BY_SERIAL_NUMBER);
// * fn(numdev, NULL, FT_LIST_NUMBER_ONLY);
printf("FT_ListDevices(%p, %p, 0x%08x) = %d\n", pArg1, pArg2, flags, rv);
if (flags & FT_LIST_NUMBER_ONLY) {
if (pArg2) printf(" W! pArg2 != null!\n");
printf("-> #devs = %d\n", *(int*)pArg1);
} else if (flags & FT_LIST_ALL) {
int numdevs = *(int*)pArg2;
const char* descr;
if (flags & FT_OPEN_BY_SERIAL_NUMBER) descr = "serial number";
else if (flags & FT_OPEN_BY_DESCRIPTION) descr = "description";
else if (flags & FT_OPEN_BY_LOCATION) descr = "location";
else descr = "WTF";
printf("-> #devs = %d, %ss:\n", numdevs, descr);
for (int i = 0; i < numdevs; ++i) {
printf(" [%d] = \"%s\"\n", i, ((char**)pArg1)[i]);
}
} else if (flags & FT_LIST_BY_INDEX) {
printf(" W! FT_LIST_BY_INDEX not impl\n");
} else printf(" W! unk flags!\n");
return rv;
}
FT_STATUS FT_Open(int devno, FT_HANDLE* pHandle) {
bind(FT_STATUS, (int, FT_HANDLE*), devno, pHandle);
printf("FT_Open(%d, &%p) = %d\n", devno, *pHandle, rv);
return rv;
}
FT_STATUS FT_OpenEx(PVOID pArg1, DWORD flags, FT_HANDLE* pHandle) {
bind(FT_STATUS, (PVOID, DWORD, FT_HANDLE*), pArg1, flags, pHandle);
printf("FT_OpenEx(%p, 0x%08x, &%p) = %d\n", pArg1, flags, *pHandle, rv);
return rv;
}
FT_STATUS FT_Read(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesReturned) {
bind(FT_STATUS, (FT_HANDLE, LPVOID, DWORD, LPDWORD),
ftHandle, lpBuffer, dwBytesToRead, lpBytesReturned);
return rv;
printf("FT_Read(%p, %p, 0x%x, &0x%x) = %d\n", ftHandle, lpBuffer, dwBytesToRead, *lpBytesReturned, rv);
size_t nb = *lpBytesReturned;
if (nb < 0x100) {
printf(" ");
size_t i;
for (i = 0; i < nb; ++i) {
printf("%02x ", ((uint8_t*)lpBuffer)[i]);
if ((i & 15) == 15) printf("\n ");
}
if ((i & 15)) printf("\n");
}
return rv;
}
FT_STATUS FT_SetBitMode(FT_HANDLE ftHandle, UCHAR ucMask, UCHAR ucEnable) {
bind(FT_STATUS, (FT_HANDLE, UCHAR, UCHAR), ftHandle, ucMask, ucEnable);
printf("FT_SetBitMode(%p, 0x%02x, 0x%02x) = %d\n", ftHandle, ucMask, ucEnable, rv);
return rv;
}
FT_STATUS FT_SetLatencyTimer(FT_HANDLE ftHandle, UCHAR ucLatency) {
bind(FT_STATUS, (FT_HANDLE, UCHAR), ftHandle, ucLatency);
printf("FT_SetLatencyTimer(%p, 0x%02x) = %d\n", ftHandle, ucLatency, rv);
return rv;
}
FT_STATUS FT_SetTimeouts(FT_HANDLE ftHandle, ULONG rto, ULONG wto) {
bind(FT_STATUS, (FT_HANDLE, ULONG, ULONG), ftHandle, rto, wto);
printf("FT_SetTimeouts(%p, 0x%08x, 0x%08x) = %d\n", ftHandle, rto, wto, rv);
return rv;
}
FT_STATUS FT_SetUSBParameters(FT_HANDLE ftHandle, ULONG inxfersz, ULONG outxfersz) {
bind(FT_STATUS, (FT_HANDLE, ULONG, ULONG), ftHandle, inxfersz, outxfersz);
printf("FT_SetUSBParameters(%p, 0x%08x, 0x%08x) = %d\n", ftHandle, inxfersz, outxfersz, rv);
return rv;
}
FT_STATUS FT_SetVIDPID(DWORD dwVid, DWORD dwPid) {
bind(FT_STATUS, (DWORD, DWORD), dwVid, dwPid);
printf("FT_SetVIDPID(0x%04x, 0x%04x) = %d\n", dwVid, dwPid, rv);
return rv;
}
FT_STATUS FT_Write(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD len, LPDWORD written) {
bind(FT_STATUS, (FT_HANDLE, LPVOID, DWORD, LPDWORD), ftHandle, lpBuffer, len, written);
printf("FT_Write(%p, %p, 0x%x, &0x%0x) = %d\n", ftHandle, lpBuffer, len, *written, rv);
size_t nb = *written;
if (nb < 0x100) {
printf(" ");
size_t i;
for (i = 0; i < nb; ++i) {
printf("%02x ", ((uint8_t*)lpBuffer)[i]);
if ((i & 15) == 15) printf("\n ");
}
if ((i & 15)) printf("\n");
}
return rv;
}
FT_STATUS FT_ReadEE(FT_HANDLE ftHandle, DWORD off, LPWORD val) {
bind(FT_STATUS, (FT_HANDLE, DWORD, LPWORD), ftHandle, off, val);
printf("FT_ReadEE(%p, 0x%04x, &0x%04x) = %d\n", ftHandle, off, *val, rv);
return rv;
}
FT_STATUS FT_WriteEE(FT_HANDLE ftHandle, DWORD off, WORD val) {
bind(FT_STATUS, (FT_HANDLE, DWORD, WORD), ftHandle, off, val);
printf("FT_WriteEE(%p, 0x%04x, 0x%04x) = %d\n", ftHandle, off, val, rv);
return rv;
}
FT_STATUS FT_EE_Program(FT_HANDLE ftHandle, PFT_PROGRAM_DATA pData) {
bind(FT_STATUS, (FT_HANDLE, PFT_PROGRAM_DATA), ftHandle, pData);
printf("FT_EE_Program(%p, %p) = %d\n", ftHandle, pData, rv);
return rv;
}
FT_STATUS FT_EE_Read(FT_HANDLE ftHandle, PFT_PROGRAM_DATA pData) {
bind(FT_STATUS, (FT_HANDLE, PFT_PROGRAM_DATA), ftHandle, pData);
printf("FT_EE_Read(%p, %p) = %d\n", ftHandle, pData, rv);
return rv;
}
FT_STATUS FT_EE_UARead(FT_HANDLE ftHandle, PUCHAR pucData, DWORD len, LPDWORD read) {
bind(FT_STATUS, (FT_HANDLE, PUCHAR, DWORD, LPDWORD), ftHandle, pucData, len, read);
printf("FT_EE_UARead(%p, %p, 0x%x, &0x%x) = %d\n", ftHandle, pucData, len, *read, rv);
return rv;
}
FT_STATUS FT_EE_UAWrite(FT_HANDLE ftHandle, PUCHAR pucData, DWORD len) {
bind(FT_STATUS, (FT_HANDLE, PUCHAR, DWORD), ftHandle, pucData, len);
printf("FT_EE_UAWrite(%p, %p, 0x%x) = %d\n", ftHandle, pucData, len, rv);
return rv;
}

BIN
ua.bin Normal file

Binary file not shown.