:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / apps / utils / pice / module / utils.h
1 /*++
2
3 Copyright (c) 1998-2001 Klaus P. Gerlicher
4
5 Module Name:
6
7     utils.h
8
9 Abstract:
10
11     HEADER for utils.c
12
13 Environment:
14
15     LINUX 2.2.X
16     Kernel mode only
17
18 Author:
19
20     Klaus P. Gerlicher
21
22 Revision History:
23
24     15-Nov-2000:    general cleanup of source files
25
26 Copyright notice:
27
28   This file may be distributed under the terms of the GNU Public License.
29
30 --*/
31 #include <stdarg.h>
32 #include "../../../../ntoskrnl/include/internal/ps.h"
33 #define __STR(x) #x
34 #define STR(x) __STR(x)
35
36 typedef enum {
37   kbDE,
38   kbUS,
39   kbDK,
40   kbMaximum
41 } KeyboardLayout;
42
43 // scancode to ASCII conversion
44 typedef struct tagSCANTOASCII
45 {
46         UCHAR s;  // 0 terminates the table
47         UCHAR a;
48 }SCANTOASCII, *PSCANTOASCII;
49
50 typedef struct tagKEYBOARD_LAYOUT
51 {
52   LPSTR name;
53   PSCANTOASCII normal;
54   PSCANTOASCII shifted;
55   PSCANTOASCII alted;
56 } KEYBOARD_LAYOUT, *PKEYBOARD_LAYOUT;
57
58 extern PKEYBOARD_LAYOUT CurrentKeyboard;
59
60 typedef struct _FRAME
61 {
62     ULONG error_code;
63     ULONG eip;
64     ULONG cs;
65     ULONG eflags;
66 }FRAME;
67
68 #define SHOW_FIELD_BYTE(ptr,field,wait)\
69 {\
70         if(wait && WaitForKey()==FALSE)\
71                 return TRUE;\
72         PICE_sprintf(tempCmd,#field" = %.2x\n",ptr->##field);\
73         Print(OUTPUT_WINDOW,tempCmd);\
74 }
75
76 #define SHOW_FIELD_WORD(ptr,field,wait)\
77 {\
78         if(wait && WaitForKey()==FALSE)\
79                 return TRUE;\
80         PICE_sprintf(tempCmd,#field" = %.4x\n",ptr->##field);\
81         Print(OUTPUT_WINDOW,tempCmd);\
82 }
83
84 #define SHOW_FIELD_DWORD(ptr,field,wait)\
85 {\
86         if(wait && WaitForKey()==FALSE)\
87                 return TRUE;\
88         PICE_sprintf(tempCmd,#field" = %.8x\n",ptr->##field);\
89         Print(OUTPUT_WINDOW,tempCmd);\
90 }
91
92 #define SHOW_FIELD_SEG_OFS(ptr,field1,field2,wait)\
93 {\
94         if(wait && WaitForKey()==FALSE)\
95                 return TRUE;\
96         PICE_sprintf(tempCmd,#field1":"#field2" = %.4x:%.8x\n",ptr->##field1,ptr->##field2);\
97         Print(OUTPUT_WINDOW,tempCmd);\
98 }
99
100 typedef struct _PCI_NUMBER
101 {
102     union {
103         struct
104         {
105             ULONG res2  : 2;
106             ULONG reg   : 6; // 64 regs per function
107             ULONG func  : 3; // 8 functions per device
108             ULONG dev   : 5; // 32 device per bus
109             ULONG bus   : 8; // 256 buses
110             ULONG res1  : 7;
111             ULONG ce    : 1; // 1 to enable
112         }bits;
113         ULONG AsUlong;
114     }u;
115 }PCI_NUMBER;
116 /*
117 typedef struct _PCI_COMMON_CONFIG {
118     USHORT  VendorID;                   // (ro)
119     USHORT  DeviceID;                   // (ro)
120     USHORT  Command;                    // Device control
121     USHORT  Status;
122     UCHAR   RevisionID;                 // (ro)
123     UCHAR   ProgIf;                     // (ro)
124     UCHAR   SubClass;                   // (ro)
125     UCHAR   BaseClass;                  // (ro)
126     UCHAR   CacheLineSize;              // (ro+)
127     UCHAR   LatencyTimer;               // (ro+)
128     UCHAR   HeaderType;                 // (ro)
129     UCHAR   BIST;                       // Built in self test
130     ULONG   BaseAddresses[6];
131     ULONG   CIS;
132     USHORT  SubVendorID;
133     USHORT  SubSystemID;
134     ULONG   ROMBaseAddress;
135     UCHAR   CapabilitiesPtr;
136     UCHAR   Reserved1[3];
137     ULONG   Reserved2;
138     UCHAR   InterruptLine;      //
139     UCHAR   InterruptPin;       // (ro)
140     UCHAR   MinimumGrant;       // (ro)
141     UCHAR   MaximumLatency;     // (ro)
142 }PCI_COMMON_CONFIG;
143 */
144
145 typedef struct tagPageDir
146 {
147         ULONG P                 :1;
148         ULONG RW                :1;
149         ULONG US                :1;
150         ULONG PWT               :1;
151         ULONG PCD               :1;
152         ULONG A                 :1;
153         ULONG dummy             :1;
154         ULONG PS                :1;
155         ULONG G                 :1;
156         ULONG Avail             :3;
157         ULONG PTBase    :20;
158 }PAGEDIR,*PPAGEDIR;
159
160 typedef struct tagGdt
161 {
162         ULONG Limit_15_0                :16;
163         ULONG Base_15_0                 :16;
164         ULONG Base_23_16                :8;
165         ULONG SegType                   :4;
166         ULONG DescType                  :1;
167         ULONG Dpl                               :2;
168         ULONG Present                   :1;
169         ULONG Limit_19_16               :4;
170         ULONG Avl                               :1;
171         ULONG Reserved                  :1;
172         ULONG DefOp                             :1;
173         ULONG Gran                              :1;
174         ULONG Base_31_24                :8;
175 }GDT,*PGDT;
176
177 typedef struct tagIdt
178 {
179         ULONG Offset_15_0               :16;
180         ULONG Selector                  :16;
181         ULONG Reserved                  :8;
182         ULONG DescType                  :5;
183         ULONG Dpl                               :2;
184         ULONG Present                   :1;
185         ULONG Offset_31_16              :16;
186 }IDT,*PIDT;
187
188 typedef struct tagDESCRIPTOR
189 {
190         USHORT Cpl      :2;             // current privilege level
191         USHORT Ti       :1;             // table index (GDT=0 LDT=1)
192         USHORT Val      :13;    // index into table
193 }DESCRIPTOR,*PDESCRIPTOR;
194
195 PKEYBOARD_LAYOUT GetKeyboardLayout();
196 PKEYBOARD_LAYOUT SetKeyboardLayoutByName(LPSTR Name);
197 void PICE_memset(void* p,unsigned char c,int sz);
198 void PICE_memcpy(void* t,void* s,int sz);
199 char *PICE_strrev(char *);
200 ULONG PICE_strcmp(char* s1,char* s2);
201 ULONG PICE_strcmpi(char* s1,char* s2);
202 ULONG PICE_strncmpi(char* s1,char* s2,ULONG len);
203 USHORT PICE_strlen(const char* s);
204 char* PICE_strcat(char* s1,char* s2);
205 BOOLEAN PICE_isprint(char c);
206 char* PICE_strcpy(char* s1,char* s2);
207 char* PICE_strncpy(char* s1,char* s2,int len);
208 char* PICE_strchr(char* s,char c);
209 int PICE_isdigit( int c );
210 int PICE_isxdigit( int c );
211 int PICE_islower( int c );
212 int PICE_isalpha( int c );
213
214 int PICE_sprintf(char * buf, const char *fmt, ...);
215 int PICE_vsprintf(char *buf, const char *fmt, va_list args);
216
217 BOOLEAN IsAddressValid(ULONG Addr);
218 BOOLEAN IsAddressWriteable(ULONG Addr);
219 BOOLEAN SetAddressWriteable(ULONG address,BOOLEAN bSet);
220 BOOLEAN IsRangeValid(ULONG addr,ULONG Length);
221 void IntelStackWalk(ULONG pc,ULONG ebp,ULONG esp);
222
223 ULONG ReadPhysMem(ULONG Address,ULONG ulSize);
224 void WritePhysMem(ULONG Address,ULONG Datum,ULONG ulSize);
225
226 BOOLEAN IsRetAtEIP(void);
227 BOOLEAN IsCallInstrAtEIP(void);
228
229 ULONG GetLinearAddress(USHORT Segment,ULONG Offset);
230
231 #define OUTPUT_BUFFER_FULL       0x01
232 #define INPUT_BUFFER_FULL        0x02
233 #define MOUSE_OUTPUT_BUFFER_FULL 0x20
234
235 void ShowStoppedMsg(void);
236 void ShowRunningMsg(void);
237
238 void SetHardwareBreakPoints(void);
239 void SetHardwareBreakPoint(ULONG ulAddress,ULONG ulReg);
240
241 // this should be in disasm.h but someone misused the header files
242 BOOLEAN Disasm(PULONG pOffset, PUCHAR pchDst);
243 //////////////////////////////////////////////////////////////////
244
245 //segments defined in \include\napi\i386\segment.h
246 #define GLOBAL_CODE_SEGMENT (KERNEL_CS)
247 #define GLOBAL_DATA_SEGMENT (KERNEL_DS)
248
249 //#define OVR_CS .byte 0x2e
250 //#define OVR_FS .byte 0x64
251
252 void DisplayRegs(void);
253 void SaveOldRegs(void);
254
255 BOOLEAN CheckLoadAbort(void);
256
257 UCHAR KeyboardGetKeyPolled(void);
258 void KeyboardFlushKeyboardQueue(void);
259
260 #define _PAGE_PRESENT   0x001
261 #define _PAGE_RW        0x002
262 #define _PAGE_USER      0x004
263 #define _PAGE_PWT       0x008
264 #define _PAGE_PCD       0x010
265 #define _PAGE_ACCESSED  0x020
266 #define _PAGE_DIRTY     0x040
267 #define _PAGE_PSE       0x080
268 #define _PAGE_4M        _PAGE_PSE
269 #define _PAGE_SIZE              0x1000
270
271
272 UCHAR AsciiFromScan(UCHAR s);
273 UCHAR AsciiToScan(UCHAR s);
274
275 void outportb(PUCHAR port,UCHAR data);
276 UCHAR inportb(PUCHAR port);
277
278 void outb_p(UCHAR data, PUCHAR port);
279 UCHAR inb_p(PUCHAR port);
280
281 VOID  outl(ULONG l, PULONG port);
282 ULONG  inl(PULONG port);
283
284
285 #define save_flags(x)         __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
286 #define restore_flags(x)      __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc")
287 #define cli()                 __asm__ __volatile__("cli": : :"memory")
288 #define sti()                 __asm__ __volatile__("sti": : :"memory")
289
290 #ifdef NDEBUG
291 #define ASSERT(x)
292 #else
293 #define ASSERT(x) if (!(x)) { DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__); KeBugCheck(0); }
294 #endif
295
296 //extern unsigned long sys_call_table[];
297
298 //struct mm_struct *GetInitMm(void);
299
300 PMADDRESS_SPACE my_init_mm;
301 LIST_ENTRY* pPsProcessListHead;
302
303 void EnablePassThrough(void);
304
305 #define PAGEDPOOL               (1)
306 #define NONPAGEDPOOL    (0)
307
308 void * PICE_malloc( size_t numBytes, BOOLEAN fromPaged );
309 void PICE_free( void* p );
310
311 HANDLE PICE_open (LPCWSTR       lpPathName,     int     iReadWrite);
312 long PICE_read(HANDLE hFile, LPVOID lpBuffer, long lBytes);
313 int PICE_close (HANDLE  hFile);
314 size_t PICE_len( HANDLE hFile );
315 WCHAR * PICE_wcscpy(WCHAR * str1,const WCHAR * str2);
316 INT
317 STDCALL
318 PICE_MultiByteToWideChar (
319         UINT    CodePage,
320         DWORD   dwFlags,
321         LPCSTR  lpMultiByteStr,
322         int     cchMultiByte,
323         LPWSTR  lpWideCharStr,
324         int     cchWideChar
325         );