/*++ Copyright (c) 1998-2001 Klaus P. Gerlicher Module Name: utils.h Abstract: HEADER for utils.c Environment: LINUX 2.2.X Kernel mode only Author: Klaus P. Gerlicher Revision History: 15-Nov-2000: general cleanup of source files Copyright notice: This file may be distributed under the terms of the GNU Public License. --*/ #include #include "../../../../ntoskrnl/include/internal/ps.h" #define __STR(x) #x #define STR(x) __STR(x) typedef enum { kbDE, kbUS, kbDK, kbMaximum } KeyboardLayout; // scancode to ASCII conversion typedef struct tagSCANTOASCII { UCHAR s; // 0 terminates the table UCHAR a; }SCANTOASCII, *PSCANTOASCII; typedef struct tagKEYBOARD_LAYOUT { LPSTR name; PSCANTOASCII normal; PSCANTOASCII shifted; PSCANTOASCII alted; } KEYBOARD_LAYOUT, *PKEYBOARD_LAYOUT; extern PKEYBOARD_LAYOUT CurrentKeyboard; typedef struct _FRAME { ULONG error_code; ULONG eip; ULONG cs; ULONG eflags; }FRAME; #define SHOW_FIELD_BYTE(ptr,field,wait)\ {\ if(wait && WaitForKey()==FALSE)\ return TRUE;\ PICE_sprintf(tempCmd,#field" = %.2x\n",ptr->##field);\ Print(OUTPUT_WINDOW,tempCmd);\ } #define SHOW_FIELD_WORD(ptr,field,wait)\ {\ if(wait && WaitForKey()==FALSE)\ return TRUE;\ PICE_sprintf(tempCmd,#field" = %.4x\n",ptr->##field);\ Print(OUTPUT_WINDOW,tempCmd);\ } #define SHOW_FIELD_DWORD(ptr,field,wait)\ {\ if(wait && WaitForKey()==FALSE)\ return TRUE;\ PICE_sprintf(tempCmd,#field" = %.8x\n",ptr->##field);\ Print(OUTPUT_WINDOW,tempCmd);\ } #define SHOW_FIELD_SEG_OFS(ptr,field1,field2,wait)\ {\ if(wait && WaitForKey()==FALSE)\ return TRUE;\ PICE_sprintf(tempCmd,#field1":"#field2" = %.4x:%.8x\n",ptr->##field1,ptr->##field2);\ Print(OUTPUT_WINDOW,tempCmd);\ } typedef struct _PCI_NUMBER { union { struct { ULONG res2 : 2; ULONG reg : 6; // 64 regs per function ULONG func : 3; // 8 functions per device ULONG dev : 5; // 32 device per bus ULONG bus : 8; // 256 buses ULONG res1 : 7; ULONG ce : 1; // 1 to enable }bits; ULONG AsUlong; }u; }PCI_NUMBER; /* typedef struct _PCI_COMMON_CONFIG { USHORT VendorID; // (ro) USHORT DeviceID; // (ro) USHORT Command; // Device control USHORT Status; UCHAR RevisionID; // (ro) UCHAR ProgIf; // (ro) UCHAR SubClass; // (ro) UCHAR BaseClass; // (ro) UCHAR CacheLineSize; // (ro+) UCHAR LatencyTimer; // (ro+) UCHAR HeaderType; // (ro) UCHAR BIST; // Built in self test ULONG BaseAddresses[6]; ULONG CIS; USHORT SubVendorID; USHORT SubSystemID; ULONG ROMBaseAddress; UCHAR CapabilitiesPtr; UCHAR Reserved1[3]; ULONG Reserved2; UCHAR InterruptLine; // UCHAR InterruptPin; // (ro) UCHAR MinimumGrant; // (ro) UCHAR MaximumLatency; // (ro) }PCI_COMMON_CONFIG; */ typedef struct tagPageDir { ULONG P :1; ULONG RW :1; ULONG US :1; ULONG PWT :1; ULONG PCD :1; ULONG A :1; ULONG dummy :1; ULONG PS :1; ULONG G :1; ULONG Avail :3; ULONG PTBase :20; }PAGEDIR,*PPAGEDIR; typedef struct tagGdt { ULONG Limit_15_0 :16; ULONG Base_15_0 :16; ULONG Base_23_16 :8; ULONG SegType :4; ULONG DescType :1; ULONG Dpl :2; ULONG Present :1; ULONG Limit_19_16 :4; ULONG Avl :1; ULONG Reserved :1; ULONG DefOp :1; ULONG Gran :1; ULONG Base_31_24 :8; }GDT,*PGDT; typedef struct tagIdt { ULONG Offset_15_0 :16; ULONG Selector :16; ULONG Reserved :8; ULONG DescType :5; ULONG Dpl :2; ULONG Present :1; ULONG Offset_31_16 :16; }IDT,*PIDT; typedef struct tagDESCRIPTOR { USHORT Cpl :2; // current privilege level USHORT Ti :1; // table index (GDT=0 LDT=1) USHORT Val :13; // index into table }DESCRIPTOR,*PDESCRIPTOR; PKEYBOARD_LAYOUT GetKeyboardLayout(); PKEYBOARD_LAYOUT SetKeyboardLayoutByName(LPSTR Name); void PICE_memset(void* p,unsigned char c,int sz); void PICE_memcpy(void* t,void* s,int sz); char *PICE_strrev(char *); ULONG PICE_strcmp(char* s1,char* s2); ULONG PICE_strcmpi(char* s1,char* s2); ULONG PICE_strncmpi(char* s1,char* s2,ULONG len); USHORT PICE_strlen(const char* s); char* PICE_strcat(char* s1,char* s2); BOOLEAN PICE_isprint(char c); char* PICE_strcpy(char* s1,char* s2); char* PICE_strncpy(char* s1,char* s2,int len); char* PICE_strchr(char* s,char c); int PICE_isdigit( int c ); int PICE_isxdigit( int c ); int PICE_islower( int c ); int PICE_isalpha( int c ); int PICE_sprintf(char * buf, const char *fmt, ...); int PICE_vsprintf(char *buf, const char *fmt, va_list args); BOOLEAN IsAddressValid(ULONG Addr); BOOLEAN IsAddressWriteable(ULONG Addr); BOOLEAN SetAddressWriteable(ULONG address,BOOLEAN bSet); BOOLEAN IsRangeValid(ULONG addr,ULONG Length); void IntelStackWalk(ULONG pc,ULONG ebp,ULONG esp); ULONG ReadPhysMem(ULONG Address,ULONG ulSize); void WritePhysMem(ULONG Address,ULONG Datum,ULONG ulSize); BOOLEAN IsRetAtEIP(void); BOOLEAN IsCallInstrAtEIP(void); ULONG GetLinearAddress(USHORT Segment,ULONG Offset); #define OUTPUT_BUFFER_FULL 0x01 #define INPUT_BUFFER_FULL 0x02 #define MOUSE_OUTPUT_BUFFER_FULL 0x20 void ShowStoppedMsg(void); void ShowRunningMsg(void); void SetHardwareBreakPoints(void); void SetHardwareBreakPoint(ULONG ulAddress,ULONG ulReg); // this should be in disasm.h but someone misused the header files BOOLEAN Disasm(PULONG pOffset, PUCHAR pchDst); ////////////////////////////////////////////////////////////////// //segments defined in \include\napi\i386\segment.h #define GLOBAL_CODE_SEGMENT (KERNEL_CS) #define GLOBAL_DATA_SEGMENT (KERNEL_DS) //#define OVR_CS .byte 0x2e //#define OVR_FS .byte 0x64 void DisplayRegs(void); void SaveOldRegs(void); BOOLEAN CheckLoadAbort(void); UCHAR KeyboardGetKeyPolled(void); void KeyboardFlushKeyboardQueue(void); #define _PAGE_PRESENT 0x001 #define _PAGE_RW 0x002 #define _PAGE_USER 0x004 #define _PAGE_PWT 0x008 #define _PAGE_PCD 0x010 #define _PAGE_ACCESSED 0x020 #define _PAGE_DIRTY 0x040 #define _PAGE_PSE 0x080 #define _PAGE_4M _PAGE_PSE #define _PAGE_SIZE 0x1000 UCHAR AsciiFromScan(UCHAR s); UCHAR AsciiToScan(UCHAR s); void outportb(PUCHAR port,UCHAR data); UCHAR inportb(PUCHAR port); void outb_p(UCHAR data, PUCHAR port); UCHAR inb_p(PUCHAR port); VOID outl(ULONG l, PULONG port); ULONG inl(PULONG port); #define save_flags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */) #define restore_flags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc") #define cli() __asm__ __volatile__("cli": : :"memory") #define sti() __asm__ __volatile__("sti": : :"memory") #ifdef NDEBUG #define ASSERT(x) #else #define ASSERT(x) if (!(x)) { DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__); KeBugCheck(0); } #endif //extern unsigned long sys_call_table[]; //struct mm_struct *GetInitMm(void); PMADDRESS_SPACE my_init_mm; LIST_ENTRY* pPsProcessListHead; void EnablePassThrough(void); #define PAGEDPOOL (1) #define NONPAGEDPOOL (0) void * PICE_malloc( size_t numBytes, BOOLEAN fromPaged ); void PICE_free( void* p ); HANDLE PICE_open (LPCWSTR lpPathName, int iReadWrite); long PICE_read(HANDLE hFile, LPVOID lpBuffer, long lBytes); int PICE_close (HANDLE hFile); size_t PICE_len( HANDLE hFile ); WCHAR * PICE_wcscpy(WCHAR * str1,const WCHAR * str2); INT STDCALL PICE_MultiByteToWideChar ( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte, LPWSTR lpWideCharStr, int cchWideChar );