#include #include "debug.h" #include "stringutils.h" #include "vectorutils.h" #include "kernelmisc.h" #include "args.h" // prun bkflash 0x50000000 0x10000 savename.nb HANDLE opendsk(const std::string& devname) { HANDLE hDev= CreateFile(ToWString(devname).c_str(), 0xc0000000, 3, NULL, 3, 4, NULL); if (hDev==NULL || hDev==INVALID_HANDLE_VALUE) { error("create(%hs)", devname.c_str()); return 0; } return hDev; } void closedsk(HANDLE hDev) { CloseHandle(hDev); } bool dsk_ioctl(HANDLE hDev, DWORD code, const ByteVector& request, ByteVector& reply) { DWORD nReturned=0; if (!DeviceIoControl(hDev, code, (void*)vectorptr(request), request.size(), (void*)vectorptr(reply), reply.size(), &nReturned, NULL)) { error("DeviceIoControl(%08lx, %d->%d), ret=%d", code, request.size(), reply.size(), nReturned); return false; } debug("ret=%d : %s\n", nReturned, hexdump(reply).c_str()); if (nReturned %08lx\n", dwOffset, data.size(), nReturned); data.resize(nReturned); return true; } bool writeblock(HANDLE hDev, DWORD dwOffset, const ByteVector& data) { DWORD req[3]; req[0]= dwOffset; req[1]= data.size(); req[2]= (DWORD)vectorptr(data); DWORD nReturned=0; if (!DeviceIoControl(hDev, 0x71FC0, (void*)req, 12, NULL, 0, &nReturned, NULL)) { error("DeviceIoControl(0x71FC0, %d), ret=%d", data.size(), nReturned); return false; } if (nReturned < data.size()) debug("!! %d bytes NOT written at %08lx\n", data.size()-nReturned, dwOffset+nReturned); return true; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { KernelMode _km; DebugSetLogfile("rdwlan.log"); debug("\n"); StringList args; if (!SplitString(ToString(lpCmdLine), args, false)) { error("Error in commandline"); return false; } DWORD dwOffset=0; DWORD dwSize=-1; std::string savename; std::string devname; HANDLE handle=0; int argnr=0; for (StringList::iterator i= args.begin() ; i!=args.end() ; ++i) { std::string& arg= *i; if (arg[0]=='-') switch(arg[1]) { case 'n': devname=arg; break; case 'h': HANDLESTLULOPTION(handle,HANDLE); break; } else { switch(argnr++) { case 0: dwOffset=strtoul(arg.c_str(), 0, 0); break; case 1: dwSize=strtoul(arg.c_str(), 0, 0); break; case 2: savename= arg; break; } } } FILE *fsave=fopen(savename.c_str(), "w+"); if (fsave==NULL) { error("fopen"); return 1; } ByteVector data; if (!devname.empty()) handle= opendsk(devname); if (handle) { debug("diskhandle=%08lx\n", handle); while (dwSize) { DWORD dwWanted= 0x20000; if (dwSize