void tdc::readWindowConfiguration() { unsigned int DATA=0x1600; writeOpcode(DATA); readOpcode(DATA); if(vLevel(NORMAL))cout<<" Match window width : "<<digit(DATA,11,0); readOpcode(DATA); if(vLevel(NORMAL))cout<<" Window ofset : "<<digit(DATA,11,0)-4096; readOpcode(DATA); if(vLevel(NORMAL))cout<<" Extra search window width: "<<digit(DATA,11,0); readOpcode(DATA); if(vLevel(NORMAL))cout<<" Reject margin width: "<<digit(DATA,11,0); readOpcode(DATA); if(vLevel(NORMAL))cout<<" Trigger time substraction : "<<digit(DATA,0); }
/* * decodeInstruction - Reads and interprets a full instruction provided by the * user. * * @param insn - A pointer to the instruction to be populated. Must be * pre-allocated. * @param reader - The function to be used to read the instruction's bytes. * @param readerArg - A generic argument to be passed to the reader to store * any internal state. * @param logger - If non-NULL, the function to be used to write log messages * and warnings. * @param loggerArg - A generic argument to be passed to the logger to store * any internal state. * @param startLoc - The address (in the reader's address space) of the first * byte in the instruction. * @param mode - The mode (real mode, IA-32e, or IA-32e in 64-bit mode) to * decode the instruction in. * @return - 0 if the instruction's memory could be read; nonzero if * not. */ int decodeInstruction(struct InternalInstruction* insn, byteReader_t reader, void* readerArg, dlog_t logger, void* loggerArg, uint64_t startLoc, DisassemblerMode mode) { memset(insn, 0, sizeof(struct InternalInstruction)); insn->reader = reader; insn->readerArg = readerArg; insn->dlog = logger; insn->dlogArg = loggerArg; insn->startLocation = startLoc; insn->readerCursor = startLoc; insn->mode = mode; insn->numImmediatesConsumed = 0; if (readPrefixes(insn) || readOpcode(insn) || getID(insn) || insn->instructionID == 0 || readOperands(insn)) return -1; insn->length = insn->readerCursor - insn->startLocation; dbgprintf(insn, "Read from 0x%llx to 0x%llx: length %zu", startLoc, insn->readerCursor, insn->length); if (insn->length > 15) dbgprintf(insn, "Instruction exceeds 15-byte limit"); return 0; }
void tdc::readResolution() { unsigned int DATA=0x2600; writeOpcode(DATA); readOpcode(DATA); if(vLevel(NORMAL))cout<<" resolution : "<<digit(DATA,1,0)<<endl;; }
void tdc::disableTDCHeaderAndTrailer() { unsigned int DATA = 0x3100; writeOpcode(DATA); DATA = 0x3200; writeOpcode(DATA); readOpcode(DATA); if (DATA%2==0) if(vLevel(NORMAL))cout << "TDC Header and Trailer disabled"<< endl; }
// Similar to the function above. TODO: factor them together before checkin. void DecodeDynamicIL(BYTE *data, ULONG Size, DacpObjectData& tokenArray) { // There is no header for this dynamic guy. // Set globals position = 0; pBuffer = data; // At this time no exception information will be displayed (fix soon) UINT indentCount = 0; ULONG endCodePosition = Size; while(position < endCodePosition) { printf("%*sIL_%04x: ", indentCount, "", position); unsigned int c = readOpcode(); OpCode opcode = opcodes[c]; printf("%s ", opcode.name); switch(opcode.args) { case InlineNone: break; case ShortInlineVar: printf("VAR OR ARG %d",readData<BYTE>()); break; case InlineVar: printf("VAR OR ARG %d",readData<unsigned short>()); break; case InlineI: printf("%d",readData<long>()); break; case InlineR: printf("%f",readData<double>()); break; case InlineBrTarget: printf("IL_%04x",readData<long>() + position); break; case ShortInlineBrTarget: printf("IL_%04x",readData<BYTE>() + position); break; case InlineI8: printf("%ld", readData<__int64>()); break; case InlineMethod: case InlineField: case InlineType: case InlineTok: case InlineSig: case InlineString: { long l = readData<long>(); DisassembleToken(tokenArray, l); break; } case InlineSwitch: { long cases = readData<long>(); long *pArray = new long[cases]; long i=0; for(i=0;i<cases;i++) { pArray[i] = readData<long>(); } printf("("); for(i=0;i<cases;i++) { if (i != 0) printf(", "); printf("IL_%04x",pArray[i] + position); } printf(")"); delete [] pArray; break; } case ShortInlineI: printf("%d", readData<char>()); break; case ShortInlineR: printf("%f", readData<float>()); break; default: printf("Error, unexpected opcode type\n"); break; } printf("\n"); } }
void DecodeIL(IMetaDataImport *pImport, BYTE *buffer, ULONG bufSize) { // First decode the header COR_ILMETHOD *pHeader = (COR_ILMETHOD *) buffer; COR_ILMETHOD_DECODER header(pHeader); // Set globals position = 0; pBuffer = (BYTE *) header.Code; UINT indentCount = 0; ULONG endCodePosition = header.GetCodeSize(); while(position < endCodePosition) { for (unsigned e=0;e<header.EHCount();e++) { IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_FAT ehBuff; const IMAGE_COR_ILMETHOD_SECT_EH_CLAUSE_FAT* ehInfo; ehInfo = header.EH->EHClause(e,&ehBuff); if (ehInfo->TryOffset == position) { printf ("%*s.try\n%*s{\n", indentCount, "", indentCount, ""); indentCount+=2; } else if ((ehInfo->TryOffset + ehInfo->TryLength) == position) { indentCount-=2; printf("%*s} // end .try\n", indentCount, ""); } if (ehInfo->HandlerOffset == position) { if (ehInfo->Flags == COR_ILEXCEPTION_CLAUSE_FINALLY) printf("%*s.finally\n%*s{\n", indentCount, "", indentCount, ""); else printf("%*s.catch\n%*s{\n", indentCount, "", indentCount, ""); indentCount+=2; } else if ((ehInfo->HandlerOffset + ehInfo->HandlerLength) == position) { indentCount-=2; if (ehInfo->Flags == COR_ILEXCEPTION_CLAUSE_FINALLY) printf("%*s} // end .finally\n", indentCount, ""); else printf("%*s} // end .catch\n", indentCount, ""); } } printf("%*sIL_%04x: ", indentCount, "", position); unsigned int c = readOpcode(); OpCode opcode = opcodes[c]; printf("%s ", opcode.name); switch(opcode.args) { case InlineNone: break; case ShortInlineVar: printf("VAR OR ARG %d",readData<BYTE>()); break; case InlineVar: printf("VAR OR ARG %d",readData<unsigned short>()); break; case InlineI: printf("%d",readData<long>()); break; case InlineR: printf("%f",readData<double>()); break; case InlineBrTarget: printf("IL_%04x",readData<long>() + position); break; case ShortInlineBrTarget: printf("IL_%04x",readData<BYTE>() + position); break; case InlineI8: printf("%ld", readData<__int64>()); break; case InlineMethod: case InlineField: case InlineType: case InlineTok: case InlineSig: { long l = readData<long>(); if (pImport != NULL) { DisassembleToken(pImport, l); } else { printf("TOKEN %x", l); } break; } case InlineString: { long l = readData<long>(); ULONG numChars; WCHAR str[84]; if ((pImport != NULL) && (pImport->GetUserString((mdString) l, str, 80, &numChars) == S_OK)) { if (numChars < 80) str[numChars] = 0; wcscpy_s(&str[79], 4, L"..."); WCHAR* ptr = str; while(*ptr != 0) { if (*ptr < 0x20 || * ptr >= 0x80) { *ptr = '.'; } ptr++; } printf("\"%S\"", str); } else { printf("STRING %x", l); } break; } case InlineSwitch: { long cases = readData<long>(); long *pArray = new long[cases]; long i=0; for(i=0;i<cases;i++) { pArray[i] = readData<long>(); } printf("("); for(i=0;i<cases;i++) { if (i != 0) printf(", "); printf("IL_%04x",pArray[i] + position); } printf(")"); delete [] pArray; break; } case ShortInlineI: printf("%d", readData<char>()); break; case ShortInlineR: printf("%f", readData<float>()); break; default: printf("Error, unexpected opcode type\n"); break; } printf("\n"); } }