APIRET rc = Dos32Profile(ULONG func, PID pid, PRFCMD *profcmd, PRFRET *profret);
0 NO ERROR ok 8 NOT_ENOUGH_MEMORY couldn't allocate profile structures 87 INVALID_PARAMETER some parameter not ok 111 BUFFER_OVERFLOW not enough size in return buffer 115 PROTECTION_VIOLATION invalid return buffer data 126 MOD_NOT_FOUND requested module data not available 303 INVALID_PROCID parameter 2 is not a valid PID 328 SYS_INTERNAL profile data structure corrupted 543 PRF_NOT_INITIALIZED profiling was not initialized 544 PRF_ALREADY_INITIALIZED profiling is already initialized 545 PRF_NOT_STARTED cannot stop profiling without start 546 PRF_ALREADY_STARTED profiling is already started 547 PRF_TIMER_OUT_OF_RANGE invalid timer frequency 548 PRF_TIMER_RESET re-initialized with different timer.
#define PRF_CM_INIT 0 /* initialize, must pass pid and profcmd */ #define PRF_CM_START 1 /* start profiling (pid) */ #define PRF_CM_STOP 2 /* stop profiling (pid) */ #define PRF_CM_CLEAR 3 /* clear profile counters (pid) */ #define PRF_CM_DUMP 4 /* read out profiling data (pid, profret) */ #define PRF_CM_EXIT 5 /* exit profiling, delete profiling structures */
pid of process to be profiled 0 if kernel profiling
command buffer struct { PRFSLOT *cm_slots; /* Virtual address slots */ USHORT cm_nslots; /* # of VA slots < 256 (!) */ USHORT cm_flags; /* command */ #define PRF_PROCESS_MT 0 /* profile proc+threads */ #define PRF_PROCESS_ST 1 /* profile proc only */ #define PRF_KERNEL 2 /* profile kernel */ #define PRF_VADETAIL 0 /* create detailed page counters */ #define PRF_VAHIT 4 /* create hit table */ #define PRF_VATOTAL 8 /* create total count for VA only */ #define PRF_FLGBITS 0x40 /* has a flgbits structure (?) */ #define PRF_WRAP 0x80 /* don't use: if hit table full, wrap */ /* there is a bug in kernel, which */ /* prevents this from correct working! */ /* status bits, don't ever set these (won't work, not masked, bug!) */ #define PRFS_RUNNING 0x100 /* profiling is active */ #define PRFS_THRDS 0x200 /* also profiling threads */ #define PRFS_HITOVFL 0x800 /* overflow in hit buffer */ #define PRFS_HEADER 0x1000 /* internally used */ ULONG cm_bufsz; /* reserve # of bytes for buffers */ /* e.g. for hit buffer or detailed */ /* counters */ USHORT cm_timval; /* timer resolution */ /* if 0, use default == 1000 */ /* valid if PRF_FLAGBITS set */ PUCHAR cm_flgbits; /* vector of flag bits (?) */ UCHAR cm_nflgs; /* # of flag bits >= 2 if present */ } PRFCMD; /* 19 bytes */ typedef struct { ULONG sl_vaddr; /* start of VA segment to profile */ ULONG sl_size; /* length of VA segment */ ULONG sl_mode; /* !=0 use PRF_VA* flags, */ /* =0, simple count */ } PRFSLOT;
typedef struct { UCHAR us_cmd; /* command */ #define PRF_RET_GLOBAL 0 /* return global data */ /* set us_thrdno for specific thread */ /* us_buf = struct PRFRET0 */ #define PRF_RET_VASLOTS 1 /* return VA slot data (PRFRET1) */ #define PRF_RET_VAHITS 2 /* return hit table (PRFRET2) */ #define PRF_RET_VADETAIL 3 /* return detailed counters (PRFRET3) */ /* specify us_vaddr */ USHORT us_thrdno; /* thread requested for cmd=0 */ ULONG us_vaddr; /* VA for cmd=3*/ ULONG us_bufsz; /* length of return buffer */ VOID *us_buf; /* return buffer */ } PRFRET; /* 15 bytes */ typedef struct { USHORT r0_flags; /* profile flags */ /* see PRF_* defines */ USHORT r0_shift; /* shift factor */ /* 2^N = length of a segment for */ /* detailed counters */ ULONG r0_idle; /* count if process is idle */ ULONG r0_vm86; /* count if process is in VM mode */ ULONG r0_kernel; /* count if process is in kernel */ ULONG r0_shrmem; /* count if process is in shr mem */ ULONG r0_unknown; /* count if process is elsewhere */ ULONG r0_nhitbufs; /* # of dwords in hitbufs */ ULONG r0_hitbufcnt; /* # of entries in hit table */ ULONG r0_reserved1; /* internally used */ ULONG r0_reserved2; /* internally used */ USHORT r0_timval; /* timer resolution */ UCHAR r0_errcnt; /* error count */ USHORT r0_nstruc1; /* # of add structures 1 (?) */ USHORT r0_nstruc2; /* # of add structures 2 (?) */ } PRFRET0; typedef struct { UCHAR r1_nslots; /* # of slots (bug: prevents */ /* correct # if #slots >255) */ PRFVA r1_slots[1]; /* slots */ } PRFRET1; typedef struct { ULONG r2_nhits; /* # of entries in table */ ULONG r2_hits[1]; /* hit table */ } PRFRET2; typedef struct { ULONG r3_size; /* size of segment */ ULONG r3_ncnts; /* # of entries in table */ ULONG r3_cnts[1]; /* counters */ } PRFRET3; typedef struct { ULONG va_vaddr; /* virtual address of segment */ ULONG va_size; /* length of segment */ ULONG va_flags; /* == 8, va_cnt is valid */ ULONG va_reserved; /* internally used */ ULONG va_cnt; /* profile count */ } PRFVA;
This page was accessed times since Jan 25th, 1996