| 1 | /* profil.h -- written by Holger Veit, donated to the public domain */
|
|---|
| 2 |
|
|---|
| 3 | typedef ULONG DWORD;
|
|---|
| 4 | typedef USHORT WORD;
|
|---|
| 5 |
|
|---|
| 6 | #define PRF_CM_INIT 0 /* initialize, must pass pid and profcmd */
|
|---|
| 7 | #define PRF_CM_START 1 /* start profiling (pid) */
|
|---|
| 8 | #define PRF_CM_STOP 2 /* stop profiling (pid) */
|
|---|
| 9 | #define PRF_CM_CLEAR 3 /* clear profile counters (pid) */
|
|---|
| 10 | #define PRF_CM_DUMP 4 /* read out profiling data (pid, profret) */
|
|---|
| 11 | #define PRF_CM_EXIT 5 /* exit profiling, delete profiling structures */
|
|---|
| 12 |
|
|---|
| 13 | #pragma pack(1)
|
|---|
| 14 |
|
|---|
| 15 | typedef struct {
|
|---|
| 16 | DWORD sl_vaddr; /* start of VA segment to profile */
|
|---|
| 17 | DWORD sl_size; /* length of VA segment */
|
|---|
| 18 | DWORD sl_mode; /* !=0 use PRF_VA* flags, */
|
|---|
| 19 | /* =0, simple count */
|
|---|
| 20 | #define PRF_SL_SIMPCNT 0
|
|---|
| 21 | #define PRF_SL_PRFVA 1
|
|---|
| 22 |
|
|---|
| 23 | } PRFSLOT;
|
|---|
| 24 |
|
|---|
| 25 | typedef struct {
|
|---|
| 26 | PRFSLOT *cm_slots; /* Virtual address slots */
|
|---|
| 27 | WORD cm_nslots; /* # of VA slots < 256 (!) */
|
|---|
| 28 | WORD cm_flags; /* command */
|
|---|
| 29 | #define PRF_PROCESS_MT 0 /* profile proc+threads */
|
|---|
| 30 | #define PRF_PROCESS_ST 1 /* profile proc only */
|
|---|
| 31 | #define PRF_KERNEL 2 /* profile kernel */
|
|---|
| 32 |
|
|---|
| 33 | #define PRF_VADETAIL 0 /* create detailed page counters */
|
|---|
| 34 | #define PRF_VAHIT 4 /* create hit table */
|
|---|
| 35 | #define PRF_VATOTAL 8 /* create total count for VA only */
|
|---|
| 36 |
|
|---|
| 37 | #define PRF_FLGBITS 0x40 /* has a flgbits structure (?) */
|
|---|
| 38 | #define PRF_WRAP 0x80 /* don't use: if hit table full, wrap */
|
|---|
| 39 | /* there is a bug in kernel, which */
|
|---|
| 40 | /* prevents this from correct working! */
|
|---|
| 41 |
|
|---|
| 42 | /* status bits, don't ever set these (won't work, not masked, bug!) */
|
|---|
| 43 | #define PRFS_RUNNING 0x100 /* profiling is active */
|
|---|
| 44 | #define PRFS_THRDS 0x200 /* also profiling threads */
|
|---|
| 45 | #define PRFS_HITOVFL 0x800 /* overflow in hit buffer */
|
|---|
| 46 | #define PRFS_HEADER 0x1000 /* internally used */
|
|---|
| 47 |
|
|---|
| 48 | DWORD cm_bufsz; /* reserve # of bytes for buffers */
|
|---|
| 49 | /* e.g. for hit buffer or detailed */
|
|---|
| 50 | /* counters */
|
|---|
| 51 | WORD cm_timval; /* timer resolution */
|
|---|
| 52 | /* if 0, use default == 1000 */
|
|---|
| 53 | /* valid if PRF_FLAGBITS set */
|
|---|
| 54 | BYTE* cm_flgbits; /* vector of flag bits (?) */
|
|---|
| 55 | BYTE cm_nflgs; /* # of flag bits >= 2 if present */
|
|---|
| 56 | } PRFCMD; /* 19 bytes */
|
|---|
| 57 |
|
|---|
| 58 | typedef struct {
|
|---|
| 59 | DWORD va_vaddr; /* virtual address of segment */
|
|---|
| 60 | DWORD va_size; /* length of segment */
|
|---|
| 61 | DWORD va_flags; /* == 8, va_cnt is valid */
|
|---|
| 62 | DWORD va_reserved; /* internally used */
|
|---|
| 63 | DWORD va_cnt; /* profile count */
|
|---|
| 64 | } PRFVA;
|
|---|
| 65 |
|
|---|
| 66 | typedef struct {
|
|---|
| 67 | BYTE us_cmd; /* command */
|
|---|
| 68 | #define PRF_RET_GLOBAL 0 /* return global data */
|
|---|
| 69 | /* set us_thrdno for specific thread */
|
|---|
| 70 | /* us_buf = struct PRFRET0 */
|
|---|
| 71 | #define PRF_RET_VASLOTS 1 /* return VA slot data (PRFRET1) */
|
|---|
| 72 | #define PRF_RET_VAHITS 2 /* return hit table (PRFRET2) */
|
|---|
| 73 | #define PRF_RET_VADETAIL 3 /* return detailed counters (PRFRET3) */
|
|---|
| 74 | /* specify us_vaddr */
|
|---|
| 75 |
|
|---|
| 76 | WORD us_thrdno; /* thread requested for cmd=0 */
|
|---|
| 77 | DWORD us_vaddr; /* VA for cmd=3*/
|
|---|
| 78 | DWORD us_bufsz; /* length of return buffer */
|
|---|
| 79 | VOID *us_buf; /* return buffer */
|
|---|
| 80 | } PRFRET; /* 15 bytes */
|
|---|
| 81 |
|
|---|
| 82 | typedef struct {
|
|---|
| 83 | WORD r0_flags; /* profile flags */
|
|---|
| 84 | /* see PRF_* defines */
|
|---|
| 85 | BYTE r0_shift; /* shift factor */
|
|---|
| 86 | /* 2^N = length of a segment for */
|
|---|
| 87 | /* detailed counters */
|
|---|
| 88 | DWORD r0_idle; /* count if process is idle */
|
|---|
| 89 | DWORD r0_vm86; /* count if process is in VM mode */
|
|---|
| 90 | DWORD r0_kernel; /* count if process is in kernel */
|
|---|
| 91 | DWORD r0_shrmem; /* count if process is in shr mem */
|
|---|
| 92 | DWORD r0_unknown; /* count if process is elsewhere */
|
|---|
| 93 | DWORD r0_nhitbufs; /* # of dwords in hitbufs */
|
|---|
| 94 | DWORD r0_hitbufcnt; /* # of entries in hit table */
|
|---|
| 95 | DWORD r0_reserved1; /* internally used */
|
|---|
| 96 | DWORD r0_reserved2; /* internally used */
|
|---|
| 97 | WORD r0_timval; /* timer resolution */
|
|---|
| 98 | BYTE r0_errcnt; /* error count */
|
|---|
| 99 | WORD r0_nstruc1; /* # of add structures 1 (?) */
|
|---|
| 100 | WORD r0_nstruc2; /* # of add structures 2 (?) */
|
|---|
| 101 | } PRFRET0;
|
|---|
| 102 |
|
|---|
| 103 | typedef struct {
|
|---|
| 104 | BYTE r1_nslots; /* # of slots (bug: prevents */
|
|---|
| 105 | /* correct # if #slots >255) */
|
|---|
| 106 | PRFVA r1_slots[1]; /* slots */
|
|---|
| 107 | } PRFRET1;
|
|---|
| 108 |
|
|---|
| 109 | typedef struct {
|
|---|
| 110 | DWORD r2_nhits; /* # of entries in table */
|
|---|
| 111 | DWORD r2_hits[1]; /* hit table */
|
|---|
| 112 | } PRFRET2;
|
|---|
| 113 |
|
|---|
| 114 | typedef struct {
|
|---|
| 115 | DWORD r3_size; /* size of segment */
|
|---|
| 116 | DWORD r3_ncnts; /* # of entries in table */
|
|---|
| 117 | DWORD r3_cnts[1]; /* counters */
|
|---|
| 118 | } PRFRET3;
|
|---|
| 119 |
|
|---|
| 120 | #pragma pack()
|
|---|
| 121 |
|
|---|
| 122 | ULONG DosProfile (DWORD func, PID pid, PRFCMD *profcmd, PRFRET *profret);
|
|---|