static int spoolss_s_OpenPrinter(void *arg, ndr_xa_t *mxa) { struct spoolss_OpenPrinter *param = arg; char *name = (char *)param->printer_name; ndr_hdid_t *id; if (name != NULL && *name != '\0') { if (strspn(name, "\\") > 2) { bzero(¶m->handle, sizeof (spoolss_handle_t)); param->status = ERROR_INVALID_PRINTER_NAME; return (NDR_DRC_OK); } smb_tracef("spoolss_s_OpenPrinter: %s", name); } if ((id = ndr_hdalloc(mxa, NULL)) == NULL) { bzero(¶m->handle, sizeof (spoolss_handle_t)); param->status = ERROR_NOT_ENOUGH_MEMORY; return (NDR_DRC_OK); } bcopy(id, ¶m->handle, sizeof (spoolss_handle_t)); param->status = 0; return (NDR_DRC_OK); }
/* * lsarpc_s_OpenDomainHandle opnum=0x06 * * This is a request to open the LSA (OpenPolicy and OpenPolicy2). * The client is looking for an LSA domain handle. */ static int lsarpc_s_OpenDomainHandle(void *arg, ndr_xa_t *mxa) { struct mslsa_OpenPolicy2 *param = arg; ndr_hdid_t *id; if ((id = ndr_hdalloc(mxa, &lsarpc_key_domain)) != NULL) { bcopy(id, ¶m->domain_handle, sizeof (mslsa_handle_t)); param->status = NT_STATUS_SUCCESS; } else { bzero(¶m->domain_handle, sizeof (mslsa_handle_t)); param->status = NT_SC_ERROR(NT_STATUS_NO_MEMORY); } return (NDR_DRC_OK); }
/* * lsarpc_s_OpenAccount * * This is a request to open an account handle. */ static int lsarpc_s_OpenAccount(void *arg, ndr_xa_t *mxa) { struct mslsa_OpenAccount *param = arg; ndr_hdid_t *id = (ndr_hdid_t *)¶m->handle; ndr_handle_t *hd; hd = ndr_hdlookup(mxa, id); if ((hd == NULL) || (hd->nh_data != &lsarpc_key_domain)) { bzero(param, sizeof (struct mslsa_OpenAccount)); param->status = NT_SC_ERROR(NT_STATUS_INVALID_HANDLE); return (NDR_DRC_OK); } if ((id = ndr_hdalloc(mxa, &lsarpc_key_account)) != NULL) { bcopy(id, ¶m->account_handle, sizeof (mslsa_handle_t)); param->status = NT_STATUS_SUCCESS; } else { bzero(¶m->account_handle, sizeof (mslsa_handle_t)); param->status = NT_SC_ERROR(NT_STATUS_NO_MEMORY); } return (NDR_DRC_OK); }