stuff
This commit is contained in:
commit
3ffb3d9344
|
@ -0,0 +1,4 @@
|
|||
dumpee
|
||||
libftfake.so
|
||||
ftd2xx.h
|
||||
WinTypes.h
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue