Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

163 lines
4.3 KiB

/*
* IDD_MSG.C - message handling code
*/
#include <ndis.h>
#include <mytypes.h>
#include <disp.h>
#include <util.h>
#include <opcodes.h>
#include <idd.h>
/* send a message down a port. only really queues message for transmittion */
INT
idd_send_msg(VOID *idd_1, IDD_MSG *msg, USHORT port, VOID (*handler)(), VOID *handler_arg)
{
IDD *idd = (IDD*)idd_1;
INT ret = IDD_E_SUCC;
IDD_SENDQ *sq;
D_LOG(D_ENTRY, ("idd_send_msg: entry, idd: 0x%p, msg: 0x%p", idd, msg));
D_LOG(D_ENTRY, ("idd_send_msg: port: %u, handler: 0x%p, handler_arg: 0x%p", \
port, handler, handler_arg));
D_LOG(D_ENTRY, ("idd_send_msg: opcode: 0x%x, buflen: 0x%x, bufptr: 0x%p", \
msg->opcode, msg->buflen, msg->bufptr));
D_LOG(D_ENTRY, ("idd_send_msg: bufid: 0x%x, param: 0x%x", \
msg->bufid, msg->param));
/* check port */
if ( port >= IDD_TX_PORTS )
{
D_LOG(D_ALWAYS, ("idd_send_msg: invalid port!"));
return(IDD_E_BADPORT);
}
sq = idd->sendq + port;
/* lock port queue */
NdisAcquireSpinLock(&sq->lock);
/* check for space */
if ( sq->num >= sq->max )
{
DbgPrint("sq->num: %d, sq->max: %d\n", sq->num, sq->max);
ret = IDD_E_NOROOM;
}
else
{
/* space avail, fill in entry */
sq->tbl[sq->put].msg = *msg;
sq->tbl[sq->put].handler = handler;
sq->tbl[sq->put].handler_arg = handler_arg;
/* update queue vars */
if ( (sq->put += 1) >= sq->max )
sq->put = 0;
sq->num++;
}
/* release lock */
NdisReleaseSpinLock(&sq->lock);
// /* (maybe) trigger processing */
// if ( ret == IDD_E_SUCC )
// idd_process(idd, 1);
if (ret == IDD_E_SUCC)
idd->PollTx(idd);
/* return here */
D_LOG(D_EXIT, ("idd_send_msg: exit, ret=0x%x", ret));
return(ret);
}
/* attach a user handler to a port */
//
INT
idd_attach(VOID *idd_1, USHORT port, VOID (*handler)(), VOID *handler_arg)
{
INT ret = IDD_E_SUCC;
IDD_RECIT *rt;
IDD *idd = (IDD*)idd_1;
D_LOG(D_ENTRY, ("idd_attach: entry, idd: 0x%p", idd));
D_LOG(D_ENTRY, ("idd_attach: port: %u, handler: 0x%p, handler_arg: 0x%p", \
port, handler, handler_arg));
/* check port */
if ( port >= IDD_RX_PORTS )
{
D_LOG(D_ALWAYS, ("idd_attach: invalid port!"));
return(IDD_E_BADPORT);
}
rt = idd->recit + port;
/* lock port table */
NdisAcquireSpinLock(&rt->lock);
/* check for space */
if ( rt->num >= rt->max )
ret = IDD_E_NOROOM;
else
{
/* space avail, fill in entry */
rt->tbl[rt->num].handler = handler;
rt->tbl[rt->num].handler_arg = handler_arg;
/* update table vars */
rt->num++;
}
/* release lock */
NdisReleaseSpinLock(&rt->lock);
/* return here */
D_LOG(D_EXIT, ("idd_attach: exit, ret=0x%x", ret));
return(ret);
}
/* detach a user handler to a port */
INT
idd_detach(VOID *idd_1, USHORT port, VOID (*handler)(), VOID *handler_arg)
{
INT ret = IDD_E_SUCC;
IDD_RECIT *rt;
INT n;
IDD *idd = (IDD*)idd_1;
D_LOG(D_ENTRY, ("idd_detach: entry, idd: 0x%p", idd));
D_LOG(D_ENTRY, ("idd_detach: port: %u, handler: 0x%p, handler_arg: 0x%p", \
port, handler, handler_arg));
/* check port */
if ( port >= IDD_RX_PORTS )
{
D_LOG(D_ALWAYS, ("idd_detach: invalid port!"));
return(IDD_E_BADPORT);
}
rt = idd->recit + port;
/* lock port table */
NdisAcquireSpinLock(&rt->lock);
/* scan table for handler/handler_arg */
for ( n = 0 ; n < rt->num ; n++ )
if ( (rt->tbl[n].handler == handler) && (rt->tbl[n].handler_arg == handler_arg) )
break;
if ( n >= rt->num )
ret = IDD_E_NOSUCH;
else
{
/* found, shrink table */
NdisMoveMemory(rt->tbl + n, rt->tbl + n + 1, sizeof(rt->tbl[0]) * (rt->num - n - 1));
rt->num--;
}
/* release lock */
NdisReleaseSpinLock(&rt->lock);
/* return here */
D_LOG(D_EXIT, ("idd_detach: exit, ret=0x%x", ret));
return(ret);
}