⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udi2go32.c

📁 gdb是linux下的一个远程调试环境.能让你很方便地调试linux下的代码.
💻 C
字号:
/*Interface from UDI calls in 32-bit mode to go32 in 16-bit mode. Communication is done through a single interrupt vector, which passesdata through two linear buffers. Call:	AH  = 0xfe	AL  = UDI function number	ECX = IN length	ESI = pointer to IN buffer	EDI = pointer to OUT bufferReturn:	EAX = return value of UDI functionVector:	0x21*/#ifdef __GO32__#include <stdlib.h>#include "udiproc.h"#include "udisoc.h"char dfe_errmsg[500];static char in_buffer[4096];static char out_buffer[4096];static char *in_ptr;static char *out_ptr;#define IN_INIT()		in_ptr = in_buffer#define IN_VAL(t,v)		*((t *)in_ptr)++ = v#define IN_DATA(ptr, cnt)	memcpy(in_ptr, ptr, cnt), in_ptr += cnt#define OUT_INIT()		out_ptr = out_buffer#define OUT_VAL(t)		(*((t *)out_ptr)++)#define OUT_DATA(ptr, cnt)	memcpy(ptr, out_ptr, cnt), out_ptr += cntstatic int DO_CALL(int function){  asm("pushl %esi");  asm("pushl %edi");  asm("movb %0, %%al" : : "g" (function));  asm("movl _in_ptr, %ecx");  asm("movl $_in_buffer, %esi");  asm("subl %esi, %ecx");  asm("movl $_out_buffer, %edi");  asm("movb $0xfe, %ah");  asm("int $0x21");  asm("popl %edi");  asm("popl %esi");}/*----------------------------------------------------------------------*/#ifdef TEST_UDIint main(){  int r;  long p2;  short p1;  IN_INIT();  IN_VAL(long, 11111111);  IN_VAL(short, 2222);  IN_DATA("Hello, world\n", 17);  r = DO_CALL(42);  OUT_INIT();  p1 = OUT_VAL(short);  p2 = OUT_VAL(long);  printf("main: p1=%d p2=%d rv=%d\n", p1, p2, r);  return r;}#endif/*----------------------------------------------------------------------*/unsupported(char *s){  printf("unsupported UDI host call %s\n", s);  abort();}UDIError UDIConnect (  char		*Configuration,		/* In */  UDISessionId	*Session		/* Out */  ){  int r;  out_buffer[0] = 0; /* DJ - test */  IN_INIT();  IN_DATA(Configuration, strlen(Configuration)+1);    r = DO_CALL(UDIConnect_c);  OUT_INIT();    *Session = OUT_VAL(UDISessionId);  return r;}UDIError UDIDisconnect (  UDISessionId	Session,		/* In */  UDIBool	Terminate		/* In */  ){  int r;  IN_INIT();  IN_VAL(UDISessionId, Session);  IN_VAL(UDIBool, Terminate);    return DO_CALL(UDIDisconnect_c);}UDIError UDISetCurrentConnection (  UDISessionId	Session			/* In */  ){  IN_INIT();  IN_VAL(UDISessionId, Session);    return DO_CALL(UDISetCurrentConnection_c);}UDIError UDICapabilities (  UDIUInt32	*TIPId,			/* Out */  UDIUInt32	*TargetId,		/* Out */  UDIUInt32	DFEId,			/* In */  UDIUInt32	DFE,			/* In */  UDIUInt32	*TIP,			/* Out */  UDIUInt32	*DFEIPCId,		/* Out */  UDIUInt32	*TIPIPCId,		/* Out */  char		*TIPString		/* Out */  ){  int r;  IN_INIT();  IN_VAL(UDIUInt32, DFEId);  IN_VAL(UDIUInt32, DFE);  r = DO_CALL(UDICapabilities_c);  OUT_INIT();  *TIPId = OUT_VAL(UDIUInt32);  *TargetId = OUT_VAL(UDIUInt32);  *TIP = OUT_VAL(UDIUInt32);  *DFEIPCId = OUT_VAL(UDIUInt32);  *TIPIPCId = OUT_VAL(UDIUInt32);  strcpy(TIPString, out_ptr);  return r;}UDIError UDIEnumerateTIPs (  UDIInt	(*UDIETCallback)	/* In */    ( char *Configuration )	/* In to callback() */  ){  UDIETCallback("montip.exe");}UDIError UDIGetErrorMsg (  UDIError	ErrorCode,		/* In */  UDISizeT	MsgSize,		/* In */  char		*Msg,			/* Out */  UDISizeT	*CountDone		/* Out */  ){  int r;  if (MsgSize > 4000)    MsgSize = 4000;  IN_INIT();  IN_VAL(UDIError, ErrorCode);  IN_VAL(UDISizeT, MsgSize);    r = DO_CALL(UDIGetErrorMsg_c);    OUT_INIT();  *CountDone = OUT_VAL(UDISizeT);  OUT_DATA(Msg, *CountDone);  return r;}UDIError UDIGetTargetConfig (  UDIMemoryRange KnownMemory[],		/* Out */  UDIInt	*NumberOfRanges,	/* In/Out */  UDIUInt32	ChipVersions[],		/* Out */  UDIInt	*NumberOfChips		/* In/Out */  ){  int r, i;  int nr = *NumberOfRanges;  int nc = *NumberOfChips;  IN_INIT();  IN_VAL(UDIInt, *NumberOfRanges);  IN_VAL(UDIInt, *NumberOfChips);  r = DO_CALL(UDIGetTargetConfig_c);  if (r == UDIErrorIncomplete)    return r;  OUT_INIT();  *NumberOfRanges = OUT_VAL(UDIInt);  *NumberOfChips = OUT_VAL(UDIInt);  for (i=0; i<nr; i++)  {    KnownMemory[i].Space = OUT_VAL(short);    KnownMemory[i].Offset = OUT_VAL(CPUOffset);    KnownMemory[i].Size = OUT_VAL(CPUSizeT);  }  for (i=0; i<nc; i++)  {    ChipVersions[i] = OUT_VAL(UDIUInt32);  }  return r;}UDIError UDICreateProcess (  UDIPId	*PId			/* Out */  ){  int r = DO_CALL(UDICreateProcess_c);  OUT_INIT();  *PId = OUT_VAL(UDIPId);  return r;}UDIError UDISetCurrentProcess (  UDIPId	PId			/* In */  ){  IN_INIT();  IN_VAL(UDIPId, PId);  return DO_CALL(UDISetCurrentProcess_c);}UDIError UDIDestroyProcess (  UDIPId	PId			/* In */  ){  IN_INIT();  IN_VAL(UDIPId, PId);  return DO_CALL(UDIDestroyProcess_c);}UDIError UDIInitializeProcess (  UDIMemoryRange ProcessMemory[],	/* In */  UDIInt	NumberOfRanges,		/* In */  UDIResource	EntryPoint,		/* In */  CPUSizeT	StackSizes[],		/* In */  UDIInt	NumberOfStacks,		/* In */  char		*ArgString		/* In */  ){  int i, r;  IN_INIT();  IN_VAL(UDIInt, NumberOfRanges);  for (i=0; i<NumberOfRanges; i++)  {    IN_VAL(short, ProcessMemory[i].Space);    IN_VAL(CPUOffset, ProcessMemory[i].Offset);    IN_VAL(CPUSizeT, ProcessMemory[i].Size);  }  IN_VAL(short, EntryPoint.Space);  IN_VAL(CPUOffset, EntryPoint.Offset);  IN_VAL(UDIInt, NumberOfStacks);  for (i=0; i<NumberOfStacks; i++)    IN_VAL(CPUSizeT, StackSizes[i]);  IN_DATA(ArgString, strlen(ArgString)+1);  return DO_CALL(UDIInitializeProcess_c);}UDIError UDIRead (  UDIResource	From,			/* In */  UDIHostMemPtr	To,			/* Out */  UDICount	Count,			/* In */  UDISizeT	Size,			/* In */  UDICount	*CountDone,		/* Out */  UDIBool	HostEndian		/* In */  ){  int cleft = Count, cthis, dthis;  int cdone = 0, r, bsize=2048/Size;    while (cleft)  {    cthis = (cleft<bsize) ? cleft : bsize;    IN_INIT();    IN_VAL(short, From.Space);    IN_VAL(CPUOffset, From.Offset);    IN_VAL(UDICount, cthis);    IN_VAL(UDISizeT, Size);    IN_VAL(UDIBool, HostEndian);    r = DO_CALL(UDIRead_c);    OUT_INIT();    dthis = OUT_VAL(UDICount);    OUT_DATA(To, dthis*Size);    cdone += dthis;    To += dthis*Size;    if (r != UDINoError)    {      *CountDone = cdone;      return r;    }    cleft -= cthis;  }  *CountDone = cdone;  return UDINoError;}UDIError UDIWrite (  UDIHostMemPtr	From,			/* In */  UDIResource	To,			/* In */  UDICount	Count,			/* In */  UDISizeT	Size,			/* In */  UDICount	*CountDone,		/* Out */  UDIBool	HostEndian		/* In */  ){  int cleft = Count, cthis, dthis;  int cdone = 0, r, bsize=2048/Size;    while (cleft)  {    cthis = (cleft<bsize) ? cleft : bsize;    IN_INIT();    IN_VAL(short, To.Space);    IN_VAL(CPUOffset, To.Offset);    IN_VAL(UDICount, cthis);    IN_VAL(UDISizeT, Size);    IN_VAL(UDIBool, HostEndian);    IN_DATA(From, cthis*Size);    From += cthis*Size;        r = DO_CALL(UDIWrite_c);    OUT_INIT();    cdone += OUT_VAL(UDICount);    if (r != UDINoError)    {      *CountDone = cdone;      return r;    }    cleft -= cthis;  }  *CountDone = cdone;  return UDINoError;}UDIError UDICopy (  UDIResource	From,			/* In */  UDIResource	To,			/* In */  UDICount	Count,			/* In */  UDISizeT	Size,			/* In */  UDICount	*CountDone,		/* Out */  UDIBool	Direction		/* In */  ){  int r;  IN_INIT();  IN_VAL(short, From.Space);  IN_VAL(CPUOffset, From.Offset);  IN_VAL(short, To.Space);  IN_VAL(CPUOffset, To.Offset);  IN_VAL(UDICount, Count);  IN_VAL(UDISizeT, Size);  IN_VAL(UDIBool, Direction);    r = DO_CALL(UDICopy_c);    OUT_INIT();  *CountDone = OUT_VAL(UDICount);    return r;}UDIError UDIExecute (  void  ){  return DO_CALL(UDIExecute_c);}UDIError UDIStep (  UDIUInt32	Steps,			/* In */  UDIStepType   StepType,		/* In */  UDIRange      Range			/* In */  ){  IN_INIT();  IN_VAL(UDIUInt32, Steps);  IN_VAL(UDIStepType, StepType);  IN_VAL(UDIRange, Range);    return DO_CALL(UDIStep_c);}UDIVoid UDIStop (  void  ){  DO_CALL(UDIStop_c);}UDIError UDIWait (  UDIInt32	MaxTime,		/* In */  UDIPId	*PId,			/* Out */  UDIUInt32	*StopReason		/* Out */  ){  int r;  IN_INIT();  IN_VAL(UDIInt32, MaxTime);  r = DO_CALL(UDIWait_c);  OUT_INIT();  *PId = OUT_VAL(UDIPId);  *StopReason = OUT_VAL(UDIUInt32);  return r;}UDIError UDISetBreakpoint (  UDIResource	Addr,			/* In */  UDIInt32	PassCount,		/* In */  UDIBreakType	Type,			/* In */  UDIBreakId	*BreakId		/* Out */  ){  int r;  IN_INIT();  IN_VAL(short, Addr.Space);  IN_VAL(CPUOffset, Addr.Offset);  IN_VAL(UDIInt32, PassCount);  IN_VAL(UDIBreakType, Type);    r = DO_CALL(UDISetBreakpoint_c);    OUT_INIT();  *BreakId = OUT_VAL(UDIBreakId);  return r;}UDIError UDIQueryBreakpoint (  UDIBreakId	BreakId,		/* In */  UDIResource	*Addr,			/* Out */  UDIInt32	*PassCount,		/* Out */  UDIBreakType	*Type,			/* Out */  UDIInt32	*CurrentCount		/* Out */  ){  int r;  IN_INIT();  IN_VAL(UDIBreakId, BreakId);    r = DO_CALL(UDIQueryBreakpoint_c);    OUT_INIT();  Addr->Space = OUT_VAL(short);  Addr->Offset = OUT_VAL(CPUOffset);  *PassCount = OUT_VAL(UDIInt32);  *Type = OUT_VAL(UDIBreakType);  *CurrentCount = OUT_VAL(UDIInt32);    return r;}UDIError UDIClearBreakpoint (  UDIBreakId	BreakId			/* In */  ){  IN_INIT();  IN_VAL(UDIBreakId, BreakId);    return DO_CALL(UDIClearBreakpoint_c);}UDIError UDIGetStdout (  UDIHostMemPtr	Buf,			/* Out */  UDISizeT	BufSize,		/* In */  UDISizeT	*CountDone		/* Out */  ){  int r;  IN_INIT();  if (BufSize > 4000)    BufSize = 4000;  IN_VAL(UDISizeT,BufSize);  r = DO_CALL(UDIGetStdout_c);  OUT_INIT();  *CountDone = OUT_VAL(UDISizeT);  if (*CountDone <= BufSize)    OUT_DATA(Buf, *CountDone);  return r;}UDIError UDIGetStderr (  UDIHostMemPtr	Buf,			/* Out */  UDISizeT	BufSize,		/* In */  UDISizeT	*CountDone		/* Out */  ){  int r;  IN_INIT();  if (BufSize > 4000)    BufSize = 4000;  IN_VAL(UDISizeT,BufSize);  r = DO_CALL(UDIGetStderr_c);  OUT_INIT();  *CountDone = OUT_VAL(UDISizeT);  OUT_DATA(Buf, *CountDone);  return r;}UDIError UDIPutStdin (  UDIHostMemPtr	Buf,			/* In */  UDISizeT	Count,			/* In */  UDISizeT	*CountDone		/* Out */  ){  int r;  IN_INIT();  if (Count > 4000)    Count = 4000;  IN_VAL(UDISizeT,Count);  IN_DATA(Buf, Count);  r = DO_CALL(UDIPutStdin_c);  OUT_INIT();  *CountDone = OUT_VAL(UDISizeT);  return r;}UDIError UDIStdinMode (  UDIMode	*Mode			/* Out */  ){  int r;  IN_INIT();  r = DO_CALL(UDIStdinMode_c);  OUT_INIT();  *Mode = OUT_VAL(UDIMode);  return r;}UDIError UDIPutTrans (  UDIHostMemPtr	Buf,			/* In */  UDISizeT	Count,			/* In */  UDISizeT	*CountDone		/* Out */  ){  int r;  IN_INIT();  if (Count > 4000)    Count = 4000;  IN_VAL(UDISizeT,Count);  IN_DATA(Buf, Count);  r = DO_CALL(UDIPutTrans_c);  OUT_INIT();  *CountDone = OUT_VAL(UDISizeT);  return r;}UDIError UDIGetTrans (  UDIHostMemPtr	Buf,			/* Out */  UDISizeT	BufSize,		/* In */  UDISizeT	*CountDone		/* Out */  ){  int r;  IN_INIT();  if (BufSize > 4000)    BufSize = 4000;  IN_VAL(UDISizeT,BufSize);  r = DO_CALL(UDIGetTrans_c);  OUT_INIT();  *CountDone = OUT_VAL(UDISizeT);  OUT_DATA(Buf, *CountDone);  return r;}UDIError UDITransMode (  UDIMode	*Mode			/* Out */  ){  int r;  IN_INIT();  r = DO_CALL(UDITransMode_c);  OUT_INIT();  *Mode = OUT_VAL(UDIMode);  return r;}#define DFEIPCIdCompany 0x0001	/* Company ID AMD */#define DFEIPCIdProduct 0x1	/* Product ID 0 */#define DFEIPCIdVersion 0x125	/* 1.2.5 */unsigned UDIGetDFEIPCId (){    return((((UDIUInt32)DFEIPCIdCompany) << 16) |(DFEIPCIdProduct << 12) | DFEIPCIdVersion);}#endif /* __GO32__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -