static UCHAR nbCancel(NetBIOSAdapter *adapter, PNCB ncb) { UCHAR ret; TRACE(": adapter %p, ncb %p\n", adapter, ncb); if (!adapter) return NRC_BRIDGE; if (!ncb) return NRC_INVADDRESS; switch (ncb->ncb_command & 0x7f) { case NCBCANCEL: case NCBADDNAME: case NCBADDGRNAME: case NCBDELNAME: case NCBRESET: case NCBSSTAT: ret = NRC_CANCEL; break; /* NCBCALL, NCBCHAINSEND/NCBSEND, NCBHANGUP all close the associated * session if cancelled */ case NCBCALL: case NCBSEND: case NCBCHAINSEND: case NCBSENDNA: case NCBCHAINSENDNA: case NCBHANGUP: { if (ncb->ncb_lsn >= adapter->sessionsLen) ret = NRC_SNUMOUT; else if (!adapter->sessions[ncb->ncb_lsn].inUse) ret = NRC_SNUMOUT; else { ret = NBCmdQueueCancel(adapter->cmdQueue, ncb); if (ret == NRC_CMDCAN || ret == NRC_CANOCCR) nbInternalHangup(adapter, &adapter->sessions[ncb->ncb_lsn]); } break; } default: ret = NBCmdQueueCancel(adapter->cmdQueue, ncb); } TRACE("returning 0x%02x\n", ret); return ret; }
UCHAR NBCmdQueueCancelAll(struct NBCmdQueue *queue) { UCHAR ret; TRACE(": queue %p\n", queue); if (!queue) return NRC_BADDR; EnterCriticalSection(&queue->cs); while (queue->head) { TRACE(": waiting for ncb %p (command 0x%02x)\n", queue->head, queue->head->ncb_command); NBCmdQueueCancel(queue, queue->head); } LeaveCriticalSection(&queue->cs); ret = NRC_GOODRET; TRACE("returning 0x%02x\n", ret); return ret; }