USHORT MNetServerEnum ( const CHAR FAR * pszServer, SHORT Level, CHAR FAR ** ppBuffer, USHORT FAR * pcEntriesRead, ULONG flServerType, CHAR FAR * pszDomain ) { USHORT usReturnCode, cbTotalAvail; SEL sel; // get a 4K buffer *ppBuffer = MGetBuffer(BIG_BUFFER_SIZE); if (*ppBuffer == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); } usReturnCode = NetServerEnum2(pszServer, Level, *ppBuffer, BIG_BUFFER_SIZE, pcEntriesRead, & cbTotalAvail, flServerType, pszDomain); // is there more data? if so, allocate a big enough buffer to get it if(usReturnCode == ERROR_MORE_DATA || usReturnCode == NERR_BufTooSmall) { NetApiBufferFree(*ppBuffer); if (DEBUGALLOC(FULL_SEG_BUFFER_SIZE, & sel, SEG_NONSHARED)) { return(ERROR_NOT_ENOUGH_MEMORY); } *ppBuffer = MAKEP(sel, 0); usReturnCode = NetServerEnum2(pszServer, Level, *ppBuffer, FULL_SEG_BUFFER_SIZE, pcEntriesRead, & cbTotalAvail, flServerType, pszDomain); } // If we're returning an error that's not moredata, or there are no // entries to return, free the buffer first if ((usReturnCode && usReturnCode != ERROR_MORE_DATA && usReturnCode != NERR_BufTooSmall) || *pcEntriesRead == 0) { NetApiBufferFree(*ppBuffer); } return (usReturnCode); }
/* ================ PFBYTE inBuf - The start of the incoming buffer (needed for offset calculations) PSMB_TRANSACTIONRQ pInReq - the incoming request PFBYTE outBuf - the outgoing buffer (needed for offset calculations) PSMB_TRANSACTIONRS pOutRes - The out going transaction response ================ */ int RAP_Proc (PSMB_SESSIONCTX pCtx, PRTSMB_HEADER pInHdr, PRTSMB_TRANSACTION pTransaction, PFVOID pInBuf, PRTSMB_HEADER pOutHdr, PRTSMB_TRANSACTION_R pTransactionR, rtsmb_size size_left) { RTSMB_RAP_REQUEST func; rtsmb_char param [50]; rtsmb_char answer [50]; int size, data_size = 0; word param_size; func.parent = pTransaction; func.parameter = param; func.parameter_size = 49; func.answer = answer; func.answer_size = 49; size = srv_cmd_read_rap_request (pCtx->read_origin, pInBuf, pCtx->current_body_size - (rtsmb_size)(PDIFF (pInBuf, pCtx->read_origin)), pInHdr, &func); if (size == -1) return 0; pInBuf = PADD (pInBuf, size); param_size = 0; switch (func.opcode) { case RAP_COM_NET_SHARE_ENUM: data_size = NetShareEnum (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_NET_SERVER_GETINFO: data_size = NetServerGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_NET_WKSTA_GETINFO: data_size = NetWkstaGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_NET_SHARE_GETINFO: data_size = NetShareGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_WPRINTQ_GETINFO: data_size = WPrintQGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; case RAP_COM_NET_SERVER_ENUM2: data_size = NetServerEnum2 (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left, ¶m_size); break; /* case RAP_COM_NET_ACCESS_GETINFO: NetAccessGetInfo (pCtx, &func, pInHdr, pInBuf, pOutHdr, size_left); break;*/ default: RTSMB_DEBUG_OUTPUT_STR ("RAP_Proc: function unhandled: ", RTSMB_DEBUG_TYPE_ASCII); RTSMB_DEBUG_OUTPUT_INT (func.opcode); RTSMB_DEBUG_OUTPUT_STR ("\n", RTSMB_DEBUG_TYPE_ASCII); } if (data_size == -2) /* special error case where we don't want to answer */ return -1; pTransactionR->setup_size = 0; pTransactionR->setup = (PFWORD)0; pTransactionR->parameter = pCtx->tmpBuffer; pTransactionR->parameter_count = param_size; if (data_size == -1) { pTransactionR->data = (PFBYTE)0; pTransactionR->data_count = 0; } else { pTransactionR->data = PADD (pCtx->tmpBuffer, param_size); pTransactionR->data_count = (word) data_size; } return 0; } // End RAP_Proc