%% options copyright owner = Dirk Krause copyright year = 2011-2014 license = bsd %% module #include "dk3all.h" #include "dkt.h" #include "dkwt.h" $!trace-include /** Compare 2 accounts. @param l Left account pointer. @param r Right account pointer. @param cr Comparison criteria (0=account/account, 1=account/name). @return Comparison result. */ static int dkwt_tool_compare_accounts(void const *l, void const *r, int cr) { int back = 0; dkwt_account_t const *pl; dkwt_account_t const *pr; pl = (dkwt_account_t const *)l; pr = (dkwt_account_t const *)r; if(l) { if(r) { switch(cr) { case 1: { if(pl->logname) { back = dk3str_casecmp(pl->logname, (dkChar const *)r); } else { back = -1; } } break; default: { if(pl->logname) { if(pr->logname) { back = dk3str_casecmp(pl->logname, pr->logname); } else { back = 1; } } else { if(pr->logname) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } if(back > 1) back = 1; if(back < -1) back = -1; return back; } /** Compare two group entries. @param l Left entry. @param r Right entry. @param cr Comparison criteria (1=structure/name, other=sructure/structure). @return Comparison result. */ static int dkwt_tool_compare_groups(void const *l, void const *r, int cr) { int back = 0; dkwt_group_t const *pl; dkwt_group_t const *pr; pl = (dkwt_group_t const *)l; pr = (dkwt_group_t const *)r; if(l) { if(r) { switch(cr) { case 1: { if(pl->groupname) { back = dk3str_casecmp(pl->groupname, (dkChar const *)r); } else { back = -1; } } break; default: { if(pl->groupname) { if(pr->groupname) { back = dk3str_casecmp(pl->groupname, pr->groupname); } else { back = 1; } } else { if(pr->groupname) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } return back; } /** Change a dynamically allocated text. @param destination Pointer to string pointer. @param source Source text. @param app Application structure for diagnostics. @param returnValue Pointer to result variable. */ static void dkwt_tool_save_text( dkChar const **destination, dkChar const *source, dk3_app_t *app, int *returnValue ) { dkChar *np; $? "+ dkwt_tool_save_text" if(source) { $? ". source ok" if(dk3str_len(source) > 0) { $? ". length ok" np = dk3str_dup_app(source, app); if(np) { $? ". dup ok" if(*destination) { dk3_delete(*destination); } *destination = np; $? ". result saved" } else { if(returnValue) { *returnValue = 0; } } } } $? "- dkwt_tool_save_text" } void dkwt_tool_close_account(dkwt_account_t *ap) { if(ap) { dk3_release(ap->textsid); dk3_release(ap->profile); dk3_release(ap->homedir); dk3_release(ap->usrcomment); dk3_release(ap->comment); dk3_release(ap->fullname); dk3_release(ap->logname); dk3_delete(ap); } } dkwt_account_t * dkwt_tool_open_account(dkChar const *logname, dk3_app_t *app) { dkwt_account_t *back = NULL; if(logname) { back = dk3_new_app(dkwt_account_t,1,app); if(back) { back->logname = NULL; back->fullname = NULL; back->comment = NULL; back->textsid = NULL; back->usrcomment = NULL; back->homedir = NULL; back->profile = NULL; back->f_long = 0; back->logname = dk3str_dup_app(logname, app); back->priv = (DWORD)0UL; back->flags = (DWORD)0UL; back->a_flags = (DWORD)0UL; back->coco = (DWORD)0UL; back->codepage = (DWORD)0UL; if(!(back->logname)) { dkwt_tool_close_account(back); back = NULL; } } } return back; } void dkwt_tool_close_account_list(dkwt_account_list_t *lp) { dkwt_account_t *ap; if(lp) { if(lp->s_acc) { if(lp->i_acc) { dk3sto_it_reset(lp->i_acc); while((ap = (dkwt_account_t *)dk3sto_it_next(lp->i_acc)) != NULL) { dkwt_tool_close_account(ap); } dk3sto_it_close(lp->i_acc); } dk3sto_close(lp->s_acc); } lp->s_acc = NULL; lp->i_acc = NULL; dk3_delete(lp); } } dkwt_account_list_t * dkwt_tool_open_account_list(dk3_app_t *app, int f_long) { dkwt_account_list_t *back = NULL; dkwt_account_t *ap = NULL; int ok = 0; NET_API_STATUS nStatus; LPUSER_INFO_0 pBuf = NULL; LPUSER_INFO_0 pTmpBuf = NULL; LPUSER_INFO_4 pb4 = NULL; DWORD dwLevel = 0; DWORD dwEntriesRead = 0; DWORD dwTotalEntries = 0; DWORD dwResumeHandle = 0; DWORD dwPreferredLength = MAX_PREFERRED_LENGTH; DWORD dwFilter = 0; /* FILTER_NORMAL_ACCOUNT */ DWORD i = 0; LPTSTR pStringSid; $? "+ dkwt_tool_open_account_list" back = dk3_new_app(dkwt_account_list_t,1,app); if(back) { $? ". back ok" back->s_acc = NULL; back->i_acc = NULL; back->s_acc = dk3sto_open_app(app); if(back->s_acc) { $? ". storage ok" dk3sto_set_comp(back->s_acc, dkwt_tool_compare_accounts, 0); back->i_acc = dk3sto_it_open(back->s_acc); if(back->i_acc) { $? ". iterator ok" ok = 1; do { pBuf = NULL; dwEntriesRead = 0; nStatus = NetUserEnum( NULL, /* Local machine */ dwLevel, /* Level 0 */ dwFilter, /* Normal users */ (LPBYTE *)(&pBuf), /* Destination */ dwPreferredLength, /* Preferred length */ &dwEntriesRead, &dwTotalEntries, &dwResumeHandle ); $? ". NetUserEnum returned %u", nStatus if((NERR_Success == nStatus) || (ERROR_MORE_DATA == nStatus)) { $? ". status ok" if(pBuf != NULL) { $? ". buffer ok" pTmpBuf = pBuf; for(i = 0; i < dwEntriesRead; i++) { $? ". entry %u / %u", (unsigned)i, (unsigned)dwEntriesRead if(pTmpBuf->usri0_name) { $? ". name ok" ap = dkwt_tool_open_account(pTmpBuf->usri0_name, app); if(ap) { $? ". open account ok" if(!dk3sto_add(back->s_acc, (void *)ap)) { ok = 0; dkwt_tool_close_account(ap); } } else { $? "! failed to open account" ok = 0; } } else { $? "! entry without a name" } pTmpBuf++; } } else { $? "! no data buffer" } } else { $? "! nStatus indicates error" } if(pBuf != NULL) { NetApiBufferFree(pBuf); pBuf = NULL; } } while(ERROR_MORE_DATA == nStatus); if(pBuf != NULL) { NetApiBufferFree(pBuf); } if(ok) { if(f_long) { dk3sto_it_reset(back->i_acc); while((ap = (dkwt_account_t *)dk3sto_it_next(back->i_acc)) != NULL) { pb4 = NULL; nStatus = NetUserGetInfo(NULL, ap->logname, (DWORD)4, (LPBYTE *)(&pb4)); if(NERR_Success == nStatus) { if(pb4) { $? ". NetUserGetInfo() ok" ap->f_long = 1; ap->priv = pb4->usri4_priv; ap->flags = pb4->usri4_flags; ap->a_flags = pb4->usri4_auth_flags; ap->coco = pb4->usri4_country_code; ap->codepage = pb4->usri4_code_page; if(pb4->usri4_full_name) { $? ". full name ok" ap->fullname = dk3str_dup_app(pb4->usri4_full_name, app); if(!(ap->fullname)) { ok = 0; } } if(pb4->usri4_comment) { $? ". comment ok" ap->comment = dk3str_dup_app(pb4->usri4_comment, app); if(!(ap->comment)) { ok = 0; } } if(pb4->usri4_usr_comment) { ap->usrcomment = dk3str_dup_app(pb4->usri4_usr_comment, app); if(!(ap->usrcomment)) { ok = 0; } } if(pb4->usri4_home_dir) { ap->homedir = dk3str_dup_app(pb4->usri4_home_dir, app); if(!(ap->homedir)) { ok = 0; } } if(pb4->usri4_profile) { ap->profile = dk3str_dup_app(pb4->usri4_profile, app); if(!(ap->profile)) { ok = 0; } } if(pb4->usri4_user_sid) { $? ". sid ok" pStringSid = NULL; if(ConvertSidToStringSid(pb4->usri4_user_sid, &pStringSid)) { if(pStringSid) { ap->textsid = dk3str_dup_app(pStringSid, app); if(!(ap->textsid)) { ok = 0; } } } if(pStringSid) { LocalFree(pStringSid); } } } else { $? "! no result from NetUserGetInfo()" } } else { $? "! NetUserGetInfo() failed %u", (unsigned)nStatus } if(pb4) { NetApiBufferFree(pb4); } } } } } else { $? "! allocation failed for iterator" } } else { $? "! allocation failed for storage" } if(!ok) { dkwt_tool_close_account_list(back); back = NULL; } } else { $? "! allocation failed" } $? "- dkwt_tool_open_account_list %s", TR_PTR(back) return back; } void dkwt_tool_reset_account_list(dkwt_account_list_t *lp) { if(lp) { if(lp->i_acc) { dk3sto_it_reset(lp->i_acc); } } } dkwt_account_t * dkwt_tool_get_account_from_list(dkwt_account_list_t *lp) { dkwt_account_t *back = NULL; if(lp) { if(lp->i_acc) { back = (dkwt_account_t *)dk3sto_it_next(lp->i_acc); } } return back; } /** Compare two group entries. @param l Left entry. @param r Right entry. @param cr Comparison criteria (0=data/data, 1=data/name). @return Comparison result. */ static int dkwt_group_compare(void *l, void *r, int cr) { int back = 0; dkwt_group_t *pl; dkwt_group_t *pr; pl = (dkwt_group_t *)l; pr = (dkwt_group_t *)r; if(l) { if(r) { switch(cr) { case 1: { if(pl->groupname) { back = dk3str_casecmp(pl->groupname, (dkChar const *)r); } else { back = -1; } } break; default: { if(pl->groupname) { if(pr->groupname) { back = dk3str_casecmp(pl->groupname, pr->groupname); } else back = 1; } else { if(pr->groupname) back = -1; } } break; } } else back = 1; } else { if(r) back = -1; } return back; } /** Close group structure, release memory. @param gp Group structure to close. */ static void dkwt_tool_close_group(dkwt_group_t *gp) { if(gp) { dk3_release(gp->groupname); dk3_release(gp->comment); dk3_release(gp->textsid); gp->attributes = (DWORD)0UL; dk3_delete(gp); } } /** Open new group structure, allocate memory. @param gn Group name. @param app Application structure for diagnostics. @return Pointer on success, NULL on error. */ static dkwt_group_t * dkwt_tool_open_group(dkChar const *gn, dk3_app_t *app) { dkwt_group_t *back = NULL; back = dk3_new_app(dkwt_group_t,1,app); if(back) { back->comment = NULL; back->textsid = NULL; back->attributes = (DWORD)0UL; back->groupname = dk3str_dup_app(gn, app); if(!(back->groupname)) { dkwt_tool_close_group(back); back = NULL; } } return back; } void dkwt_tool_reset_group_list(dkwt_group_list_t *glp) { if(glp) { if(glp->i_grp) { dk3sto_it_reset(glp->i_grp); } } } dkwt_group_t * dkwt_tool_get_group_from_list(dkwt_group_list_t *glp) { dkwt_group_t *back = NULL; if(glp) { if(glp->i_grp) { back = (dkwt_group_t *)dk3sto_it_next(glp->i_grp); } } return back; } void dkwt_tool_close_group_list(dkwt_group_list_t *glp) { dkwt_group_t *gp; if(glp) { if(glp->s_grp) { if(glp->i_grp) { dk3sto_it_reset(glp->i_grp); while((gp = (dkwt_group_t *)dk3sto_it_next(glp->i_grp)) != NULL) { dkwt_tool_close_group(gp); } dk3sto_it_close(glp->i_grp); } dk3sto_close(glp->s_grp); } glp->s_grp = NULL; glp->i_grp = NULL; dk3_delete(glp); } } /** Destroy group, release memory. @param gp Group to destroy. */ static void dkwt_tool_group_close(dkwt_group_t *gp) { if(gp) { dk3_release(gp->groupname); dk3_release(gp->comment); dk3_release(gp->textsid); gp->attributes = (DWORD)0UL; dk3_delete(gp); } } /** Create group, allocate memory. @param gn Group name. @param app Application structure for diagnostics, may be NULL. @return Pointer to new group structure on success, NULL on error. */ static dkwt_group_t * dkwt_tool_group_open(dkChar const *gn, dk3_app_t *app) { dkwt_group_t *back = NULL; if(gn) { back = dk3_new_app(dkwt_group_t,1,app); if(back) { back->comment = NULL; back->textsid = NULL; back->attributes = (DWORD)0UL; back->gtype = DKWT_GROUP_NET; back->groupname = dk3str_dup_app(gn,app); if(!(back->groupname)) { dkwt_tool_group_close(back); back = NULL; } } } return back; } /** Read group list from system. @param gl Group list (destination). @param app Application structure for diagnostics. @param f_long Flag: Detailed (non-zero) or short (0). @return 1 on success, 0 on error. */ static int dkwt_tool_read_group_list(dkwt_group_list_t *gl, dk3_app_t *app, int f_long) { int back = 1; NET_API_STATUS nStatus; DWORD dwLevel = 0; DWORD dwPrefmaxlen = MAX_PREFERRED_LENGTH; DWORD dwEntries = 0; DWORD dwTotal = 0; DWORD_PTR dwResumeHandle = 0; DWORD i; LPBYTE pBuf; GROUP_INFO_0 *grptr; GROUP_INFO_3 *gr3ptr; LOCALGROUP_INFO_0 *lgrptr; LOCALGROUP_INFO_1 *lgr1ptr; dkwt_group_t *newgroup; LPTSTR stringsid; $? "+ dkwt_tool_read_group_list" /* Group information for network groups */ do { pBuf = NULL; dwEntries = 0; nStatus = NetGroupEnum( NULL, dwLevel, &pBuf, dwPrefmaxlen, &dwEntries, &dwTotal, &dwResumeHandle ); if((ERROR_MORE_DATA == nStatus) || (NERR_Success == nStatus)) { if(pBuf) { $? ". found" grptr = (GROUP_INFO_0 *)pBuf; for(i = 0; i < dwEntries; i++) { if(grptr->grpi0_name) { $? ". yet another group \"%ls\"", grptr->grpi0_name newgroup = dkwt_tool_group_open(grptr->grpi0_name, app); if(newgroup) { if(!dk3sto_add(gl->s_grp, newgroup)) { back = 0; dkwt_tool_group_close(newgroup); } } else { back = 0; } } grptr++; } } } if(pBuf) { NetApiBufferFree(pBuf); pBuf = NULL; } } while(ERROR_MORE_DATA == nStatus); /* Group information for local groups. */ dwLevel = (DWORD)0; dwResumeHandle = 0; do { pBuf = NULL; dwEntries = (DWORD)0UL; nStatus = NetLocalGroupEnum( NULL, dwLevel, &pBuf, dwPrefmaxlen, &dwEntries, &dwTotal, &dwResumeHandle ); if((ERROR_MORE_DATA == nStatus) || (NERR_Success == nStatus)) { if(pBuf) { lgrptr = (LOCALGROUP_INFO_0 *)pBuf; for(i = 0; i < dwEntries; i++) { if(lgrptr->lgrpi0_name) { newgroup = dkwt_tool_group_open(lgrptr->lgrpi0_name, app); if(newgroup) { newgroup->gtype = DKWT_GROUP_LOCAL; if(!dk3sto_add(gl->s_grp, newgroup)) { back = 0; dkwt_tool_group_close(newgroup); } } else { back = 0; } } lgrptr ++; } } } if(pBuf) { NetApiBufferFree(pBuf); pBuf = NULL; } } while(ERROR_MORE_DATA == nStatus); if(f_long) { if(back) { dk3sto_it_reset(gl->i_grp); while((newgroup = (dkwt_group_t *)dk3sto_it_next(gl->i_grp)) != NULL) { pBuf = NULL; $? ". Retrieve \"%ls\"", TR_STR(newgroup->groupname) if(newgroup->gtype == DKWT_GROUP_LOCAL) { $? ". local group" dwLevel = 1; pBuf = NULL; nStatus = NetLocalGroupGetInfo( NULL, newgroup->groupname, dwLevel, &pBuf ); if(NERR_Success == nStatus) { $? ". success 1" if(pBuf) { lgr1ptr = (LOCALGROUP_INFO_1 *)pBuf; if(lgr1ptr->lgrpi1_comment) { newgroup->comment = dk3str_dup_app(lgr1ptr->lgrpi1_comment, app); if(!(newgroup->comment)) { back = 0; } } } } else { back = 0; } if(pBuf) { NetApiBufferFree(pBuf); pBuf = NULL; } } else { $? ". network group" dwLevel = 3; pBuf = NULL; nStatus = NetGroupGetInfo( NULL, newgroup->groupname, dwLevel, &pBuf ); if(NERR_Success == nStatus) { $? ". success 3" if(pBuf) { gr3ptr = (GROUP_INFO_3 *)pBuf; if(gr3ptr->grpi3_comment) { newgroup->comment = dk3str_dup_app(gr3ptr->grpi3_comment, app); if(!(newgroup->comment)) { back = 0; } } if(gr3ptr->grpi3_group_sid) { stringsid = NULL; if(ConvertSidToStringSid(gr3ptr->grpi3_group_sid, &stringsid)) { if(stringsid) { newgroup->textsid = dk3str_dup_app(stringsid, app); if(!(newgroup->textsid)) { back = 0; } } } if(stringsid) { LocalFree(stringsid); } } newgroup->attributes = gr3ptr->grpi3_attributes; } } else { back = 0; } if(pBuf) { NetApiBufferFree(pBuf); pBuf = NULL; } } } } } $? "- dkwt_tool_read_group_list %d", back return back; } dkwt_group_list_t * dkwt_tool_open_group_list(dk3_app_t *app, int f_long) { dkwt_group_list_t *back = NULL; int ok = 0; $? "+ dkwt_tool_open_group_list" back = dk3_new_app(dkwt_group_list_t,1,app); if(back) { back->i_grp = NULL; back->s_grp = dk3sto_open_app(app); if(back->s_grp) { dk3sto_set_comp(back->s_grp, dkwt_tool_compare_groups, 0); back->i_grp = dk3sto_it_open(back->s_grp); if(back->i_grp) { ok = dkwt_tool_read_group_list(back, app, f_long); } } if(!(ok)) { dkwt_tool_close_group_list(back); back = NULL; } } $? "- dkwt_tool_open_group_list %d", ((back) ? 1 : 0) return back; } /** Compare printer entries. @param l Left printer. @param r Right printer. @param cr Comparison criteria (1=structure/name, other=structure/structure). @return Comparison result. */ static int dkwt_to_compare_printers(void const *l, void const *r, int cr) { int back = 0; dkwt_printer_t const *pl; dkwt_printer_t const *pr; pl = (dkwt_printer_t *)l; pr = (dkwt_printer_t *)r; if(l) { if(r) { switch(cr) { case 1: { if(pl->printerName) { back = dk3str_casecmp(pl->printerName, (dkChar const *)r); } else back = -1; } break; default: { if(pl->printerName) { if(pr->printerName) { back = dk3str_casecmp(pl->printerName, pr->printerName); } else { back = 1; } } else { if(pr->printerName) { back = -1; } } } break; } } else { back = 1; } } else { if(r) { back = -1; } } if(back > 1) back = 1; if(back < -1) back = -1; return back; } /** Delete printer structure, release memory. @param pr Structure to delete. */ static void dkwt_tool_printer_delete(dkwt_printer_t *pr) { if(pr) { dk3_release(pr->printerName); dk3_release(pr->comment); dk3_release(pr->location); dk3_release(pr->serverName); dk3_release(pr->shareName); dk3_release(pr->portName); dk3_release(pr->driverName); dk3_release(pr->deviceName); dk3_release(pr->separatorFile); dk3_release(pr->printProcessor); dk3_release(pr->dataType); dk3_release(pr->parameters); dk3_release(pr->description); pr->attributes = pr->status = pr->nJobs = (DWORD)0UL; dk3_delete(pr); } } /** Create printer structure, allocate memory. @param pn Printer name. @param app Application structure for diagnostics. @return Pointer to new structure on success, NULL on error. */ static dkwt_printer_t * dkwt_tool_printer_new(dkChar const *pn, dk3_app_t *app) { dkwt_printer_t *back = NULL; back = dk3_new_app(dkwt_printer_t,1,app); if(back) { back->description = NULL; back->comment = NULL; back->location = NULL; back->serverName = NULL; back->shareName = NULL; back->portName = NULL; back->driverName = NULL; back->deviceName = NULL; back->separatorFile = NULL; back->printProcessor = NULL; back->dataType = NULL; back->parameters = NULL; back->attributes = back->status = back->nJobs = (DWORD)0UL; back->printerName = dk3str_dup_app(pn, app); if(!(back->printerName)) { dkwt_tool_printer_delete(back); back = NULL; } } return back; } void dkwt_tool_close_printer_list(dkwt_printer_list_t *pl) { dkwt_printer_t *pr; if(pl) { if(pl->s_prn) { if(pl->i_prn) { dk3sto_it_reset(pl->i_prn); while((pr = (dkwt_printer_t *)dk3sto_it_next(pl->i_prn)) != NULL) { dkwt_tool_printer_delete(pr); } dk3sto_it_close(pl->i_prn); } pl->i_prn = NULL; dk3sto_close(pl->s_prn); } pl->s_prn = NULL; dk3_delete(pl); } } /** Read printer list from system. @param pl Printer list (destination). @param app Application structure for diagnostics. @param f_long Flag: Detailed (non-zero) or short (0). @return 1 on success, 0 on error. */ static int dkwt_tool_read_printer_list( dkwt_printer_list_t *pl, dk3_app_t *app, int f_long ) { int back = 0; char *peb = NULL; DWORD szpeb; DWORD cbNeeded; DWORD cbReturned; DWORD i; PRINTER_INFO_2 *pi2; dkwt_printer_t *pr; cbNeeded = (DWORD)0UL; cbReturned = (DWORD)0UL; $? "+ dkwt_tool_read_printer_list %d", f_long EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &cbNeeded, &cbReturned ); if(cbNeeded > 0) { peb = dk3_new_app(char,(size_t)cbNeeded,app); if(peb) { szpeb = cbNeeded; cbNeeded = (DWORD)0UL; cbReturned = (DWORD)0UL; if(EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)peb, szpeb, &cbNeeded, &cbReturned ) ) { if(cbReturned > (DWORD)0UL) { pi2 = (PRINTER_INFO_2 *)peb; back = 1; for(i = 0; i < cbReturned; i++) { if(pi2->pPrinterName) { $? ". \"%ls\"", pi2->pPrinterName pr = dkwt_tool_printer_new(pi2->pPrinterName, app); if(pr) { $? ". pr ok" if(dk3sto_add(pl->s_prn, (void *)pr)) { $? ". add ok" if(f_long) { $? ". long" dkwt_tool_save_text( &(pr->comment), pi2->pComment, app, &back ); dkwt_tool_save_text( &(pr->location), pi2->pLocation, app, &back ); dkwt_tool_save_text( &(pr->serverName), pi2->pServerName, app, &back ); dkwt_tool_save_text( &(pr->shareName), pi2->pShareName, app, &back ); dkwt_tool_save_text( &(pr->portName), pi2->pPortName, app, &back ); dkwt_tool_save_text( &(pr->driverName), pi2->pDriverName, app, &back ); #if 0 dkwt_tool_save_text( &(pr->deviceName), pi2->pDeviceName, app, &back ); #endif dkwt_tool_save_text( &(pr->separatorFile), pi2->pSepFile, app, &back ); dkwt_tool_save_text( &(pr->printProcessor), pi2->pPrintProcessor, app, &back ); dkwt_tool_save_text( &(pr->dataType), pi2->pDatatype, app, &back ); dkwt_tool_save_text( &(pr->parameters), pi2->pParameters, app, &back ); pr->attributes = pi2->Attributes; pr->status = pi2->Status; pr->nJobs = pi2->cJobs; } else { $? ". short info enough" } } else { dkwt_tool_printer_delete(pr); back = 0; } } else { back = 0; } } pi2++; } } } dk3_delete(peb); } } else { /* ERROR: Failed to obtain byte number. */ dk3app_log_i1(app, DK3_LL_ERROR, 244); } $? "- dkwt_tool_read_printer_list %d", back return back; } dkwt_printer_list_t * dkwt_tool_open_printer_list(dk3_app_t *app, int f_long) { dkwt_printer_list_t *back = NULL; back = dk3_new_app(dkwt_printer_list_t,1,app); if(back) { back->i_prn = NULL; back->s_prn = dk3sto_open_app(app); if(back->s_prn) { dk3sto_set_comp(back->s_prn, dkwt_to_compare_printers, 0); back->i_prn = dk3sto_it_open(back->s_prn); } if((back->s_prn) && (back->i_prn)) { if(!dkwt_tool_read_printer_list(back, app, f_long)) { dkwt_tool_close_printer_list(back); back = NULL; } } else { dkwt_tool_close_printer_list(back); back = NULL; } } return back; } void dkwt_tool_printer_list_reset(dkwt_printer_list_t *pl) { if(pl) { if(pl->i_prn) { dk3sto_it_reset(pl->i_prn); } } } dkwt_printer_t * dkwt_tool_printer_list_next(dkwt_printer_list_t *pl) { dkwt_printer_t *back = NULL; if(pl) { if(pl->i_prn) { back = (dkwt_printer_t *)dk3sto_it_next(pl->i_prn); } } return back; } long dkwt_tool_reg_open_key( HKEY key, dkChar const *skn, REGSAM sam, PHKEY phk ) { long res; DWORD dw0; dw0 = (DWORD)0; #if DK3_CHAR_SIZE > 1 res = RegOpenKeyExW(key, skn, dw0, sam, phk); #else res = RegOpenKeyExA(key, skn, dw0, sam, phk); #endif return res; } long dkwt_tool_reg_query_value( HKEY hk, dkChar const *vn, DWORD *pDwTp, void *buf, DWORD *pDwSz ) { long res; #if DK3_CHAR_SIZE > 1 res = RegQueryValueExW( hk, vn, NULL, pDwTp, (LPBYTE)buf, pDwSz ); #else res = RegQueryValueExA( hk, vn, NULL, pDwTp, (LPBYTE)buf, pDwSz ); #endif return res; } long dkwt_tool_reg_delete_value( HKEY hk, dkChar const *en ) { long res; #if DK3_CHAR_SIZE > 1 res = RegDeleteValueW(hk, en); #else res = RegDeleteValueA(hk, en); #endif return res; } long dkwt_tool_reg_delete_tree( HKEY hk, dkChar const *tn ) { long res; #if DK3_CHAR_SIZE > 1 res = RegDeleteTreeW(hk, tn); #else res = RegDeleteTreeA(hk, tn); #endif return res; } long dkwt_tool_reg_enum_key( HKEY hk, DWORD dwIndex, dkChar *pResult, DWORD *pDwSzResult, dkChar *pClass, DWORD *pDwSzClass, PFILETIME pLastWrite ) { long res; $? "+ dkwt_tool_reg_enum_key %ld", (long)dwIndex #if DK3_CHAR_SIZE > 1 res = RegEnumKeyExW( hk, dwIndex, pResult, pDwSzResult, NULL, pClass, pDwSzClass, pLastWrite ); #else res = RegEnumKeyExA( hk, dwIndex, pResult, pDwSzResult, NULL, pClass, pDwSzClass, pLastWrite ); #endif $? "- dkwt_tool_reg_enum_key %ld", res return res; } long dkwt_tool_reg_create_key( HKEY hk, dkChar const *kn, DWORD dwOptions, REGSAM sam, PHKEY pHkeyResult, LPDWORD lpDwDisposition ) { long res; DWORD dw0; dw0 = 0; #if DK3_CHAR_SIZE > 1 res = RegCreateKeyExW( hk, kn, dw0, NULL, dwOptions, sam, NULL, pHkeyResult, lpDwDisposition ); #else res = RegCreateKeyExA( hk, kn, dw0, NULL, dwOptions, sam, NULL, pHkeyResult, lpDwDisposition ); #endif return res; } long dkwt_ev_reg_set_value( HKEY hk, dkChar const *vn, DWORD dwType, void *pData, DWORD szData ) { long res; DWORD dw0; dw0 = 0; #if DK3_CHAR_SIZE > 1 res = RegSetValueExW( hk, vn, dw0, dwType, (BYTE const *)pData, szData ); #else res = RegSetValueExA( hk, vn, dw0, dwType, (BYTE const *)pData, szData ); #endif return res; }