#include #include "debug.h" #include "stringutils.h" #include "vectorutils.h" #include "args.h" #include "kernelmisc.h" // [-c CODE] [-r OUTSIZE] [-n] .. reqdata bool kioctl(DWORD code, const ByteVector& request, ByteVector& reply) { DWORD nReturned; if (!KernelIoControl(code, (void*)vectorptr(request), request.size(), (void*)vectorptr(reply), reply.size(), &nReturned)) { error("KernelIoControl(%08lx, %d->%d), ret=%d\n", code, request.size(), reply.size(), nReturned); return false; } reply.resize(nReturned); return true; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { DebugSetLogfile("tstkio.log"); debug("\n"); StringList args; if (!SplitString(ToString(lpCmdLine), args, false)) { error("Error in commandline"); return false; } ByteVector request; ByteVector reply; DWORD replysize; DWORD code; bool bKernelMode= true; for (StringList::iterator i= args.begin() ; i!=args.end() ; ++i) { std::string& arg= *i; if (arg[0]=='-') switch(arg[1]) { case 'c': HANDLESTLULOPTION(code, DWORD); break; case 'r': HANDLESTLULOPTION(replysize, DWORD); break; case 'n': bKernelMode= false; break; } else { DWORD val= strtoul(arg.c_str(), 0, 16); if (arg.size()>4) BV_AppendDword(request, val); else if (arg.size()>2) BV_AppendWord(request, val); else BV_AppendByte(request, val); } } reply.resize(replysize); debug("sending %08lx %s\n", code, hexdump(request).c_str()); debug("expecting %d bytes reply\n", replysize); BOOL bMode=FALSE; DWORD dwPerm=0; if (bKernelMode) { BOOL bMode = SetKMode(TRUE); DWORD dwPerm = SetProcPermissions(0xFFFFFFFF); } if (!kioctl(code, request, reply)) { debug("error in ioctl\n"); } if (bKernelMode) { SetProcPermissions(dwPerm); SetKMode(bMode); } debug("got %d bytes reply\n", reply.size()); debug("request: %s\n", hexdump(request).c_str()); debug("reply : %s\n", hexdump(reply).c_str()); debug("\n"); return 0; }