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

4 years ago
  1. /*
  2. * IDD_MSG.C - message handling code
  3. */
  4. #include <ndis.h>
  5. #include <mytypes.h>
  6. #include <disp.h>
  7. #include <util.h>
  8. #include <opcodes.h>
  9. #include <idd.h>
  10. /* send a message down a port. only really queues message for transmittion */
  11. INT
  12. idd_send_msg(VOID *idd_1, IDD_MSG *msg, USHORT port, VOID (*handler)(), VOID *handler_arg)
  13. {
  14. IDD *idd = (IDD*)idd_1;
  15. INT ret = IDD_E_SUCC;
  16. IDD_SENDQ *sq;
  17. D_LOG(D_ENTRY, ("idd_send_msg: entry, idd: 0x%p, msg: 0x%p", idd, msg));
  18. D_LOG(D_ENTRY, ("idd_send_msg: port: %u, handler: 0x%p, handler_arg: 0x%p", \
  19. port, handler, handler_arg));
  20. D_LOG(D_ENTRY, ("idd_send_msg: opcode: 0x%x, buflen: 0x%x, bufptr: 0x%p", \
  21. msg->opcode, msg->buflen, msg->bufptr));
  22. D_LOG(D_ENTRY, ("idd_send_msg: bufid: 0x%x, param: 0x%x", \
  23. msg->bufid, msg->param));
  24. /* check port */
  25. if ( port >= IDD_TX_PORTS )
  26. {
  27. D_LOG(D_ALWAYS, ("idd_send_msg: invalid port!"));
  28. return(IDD_E_BADPORT);
  29. }
  30. sq = idd->sendq + port;
  31. /* lock port queue */
  32. NdisAcquireSpinLock(&sq->lock);
  33. /* check for space */
  34. if ( sq->num >= sq->max )
  35. {
  36. DbgPrint("sq->num: %d, sq->max: %d\n", sq->num, sq->max);
  37. ret = IDD_E_NOROOM;
  38. }
  39. else
  40. {
  41. /* space avail, fill in entry */
  42. sq->tbl[sq->put].msg = *msg;
  43. sq->tbl[sq->put].handler = handler;
  44. sq->tbl[sq->put].handler_arg = handler_arg;
  45. /* update queue vars */
  46. if ( (sq->put += 1) >= sq->max )
  47. sq->put = 0;
  48. sq->num++;
  49. }
  50. /* release lock */
  51. NdisReleaseSpinLock(&sq->lock);
  52. // /* (maybe) trigger processing */
  53. // if ( ret == IDD_E_SUCC )
  54. // idd_process(idd, 1);
  55. if (ret == IDD_E_SUCC)
  56. idd->PollTx(idd);
  57. /* return here */
  58. D_LOG(D_EXIT, ("idd_send_msg: exit, ret=0x%x", ret));
  59. return(ret);
  60. }
  61. /* attach a user handler to a port */
  62. //
  63. INT
  64. idd_attach(VOID *idd_1, USHORT port, VOID (*handler)(), VOID *handler_arg)
  65. {
  66. INT ret = IDD_E_SUCC;
  67. IDD_RECIT *rt;
  68. IDD *idd = (IDD*)idd_1;
  69. D_LOG(D_ENTRY, ("idd_attach: entry, idd: 0x%p", idd));
  70. D_LOG(D_ENTRY, ("idd_attach: port: %u, handler: 0x%p, handler_arg: 0x%p", \
  71. port, handler, handler_arg));
  72. /* check port */
  73. if ( port >= IDD_RX_PORTS )
  74. {
  75. D_LOG(D_ALWAYS, ("idd_attach: invalid port!"));
  76. return(IDD_E_BADPORT);
  77. }
  78. rt = idd->recit + port;
  79. /* lock port table */
  80. NdisAcquireSpinLock(&rt->lock);
  81. /* check for space */
  82. if ( rt->num >= rt->max )
  83. ret = IDD_E_NOROOM;
  84. else
  85. {
  86. /* space avail, fill in entry */
  87. rt->tbl[rt->num].handler = handler;
  88. rt->tbl[rt->num].handler_arg = handler_arg;
  89. /* update table vars */
  90. rt->num++;
  91. }
  92. /* release lock */
  93. NdisReleaseSpinLock(&rt->lock);
  94. /* return here */
  95. D_LOG(D_EXIT, ("idd_attach: exit, ret=0x%x", ret));
  96. return(ret);
  97. }
  98. /* detach a user handler to a port */
  99. INT
  100. idd_detach(VOID *idd_1, USHORT port, VOID (*handler)(), VOID *handler_arg)
  101. {
  102. INT ret = IDD_E_SUCC;
  103. IDD_RECIT *rt;
  104. INT n;
  105. IDD *idd = (IDD*)idd_1;
  106. D_LOG(D_ENTRY, ("idd_detach: entry, idd: 0x%p", idd));
  107. D_LOG(D_ENTRY, ("idd_detach: port: %u, handler: 0x%p, handler_arg: 0x%p", \
  108. port, handler, handler_arg));
  109. /* check port */
  110. if ( port >= IDD_RX_PORTS )
  111. {
  112. D_LOG(D_ALWAYS, ("idd_detach: invalid port!"));
  113. return(IDD_E_BADPORT);
  114. }
  115. rt = idd->recit + port;
  116. /* lock port table */
  117. NdisAcquireSpinLock(&rt->lock);
  118. /* scan table for handler/handler_arg */
  119. for ( n = 0 ; n < rt->num ; n++ )
  120. if ( (rt->tbl[n].handler == handler) && (rt->tbl[n].handler_arg == handler_arg) )
  121. break;
  122. if ( n >= rt->num )
  123. ret = IDD_E_NOSUCH;
  124. else
  125. {
  126. /* found, shrink table */
  127. NdisMoveMemory(rt->tbl + n, rt->tbl + n + 1, sizeof(rt->tbl[0]) * (rt->num - n - 1));
  128. rt->num--;
  129. }
  130. /* release lock */
  131. NdisReleaseSpinLock(&rt->lock);
  132. /* return here */
  133. D_LOG(D_EXIT, ("idd_detach: exit, ret=0x%x", ret));
  134. return(ret);
  135. }