For this sample driver, the source code for the handler function looks like this:
struct mini_data
{
uint16_t nstartup;
uint16_t nstartupp;
uint16_t nstartupf;
uint16_t nkernel;
uint16_t nprocess;
uint16_t data_len;
};
/*
* Sample minidriver handler function for debug purposes
*
* Counts the number of calls for each state and
* fills the data area with the current handler state
*/
int
mini_data(int state, void *data)
{
uint8_t *dptr;
struct mini_data *mdata;
mdata = (struct mini_data *) data;
dptr = (uint8_t *) (mdata + 1);
/* on MDRIVER_INIT, set up the data area */
if (state == MDRIVER_INIT)
{
mdata->nstartup = 0;
mdata->nstartupf = 0;
mdata->nstartupp = 0;
mdata->nkernel = 0;
mdata->nprocess = 0;
mdata->data_len = 0;
}
/* count the number of calls we get for each type */
if (state == MDRIVER_STARTUP)
mdata->nstartup = mdata->nstartup + 1;
else if (state == MDRIVER_STARTUP_PREPARE)
mdata->nstartupp = mdata->nstartupp + 1;
else if (state == MDRIVER_STARTUP_FINI)
mdata->nstartupf = mdata->nstartupf + 1;
else if (state == MDRIVER_KERNEL)
mdata->nkernel = mdata->nkernel + 1;
else if (state == MDRIVER_PROCESS)
mdata->nprocess = mdata->nprocess + 1;
else if (state == MDRIVER_INTR_ATTACH)
{
/* normally disable my interrupt */
return (1);
}
/* put the state information in the data area
after the structure if we have room */
if (mdata->data_len < 60000 ) {
dptr[mdata->data_len] = (uint8_t) state;
mdata->data_len = mdata->data_len + 1;
}
return (0);
}
A few things to note: