BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum,
POLICY_HND *hnd,
uint32 services_type, uint32 services_state,
- uint32 buf_size, uint32 *resume_hnd,
- ENUM_SRVC_STATUS **svcs);
+ uint32 *buf_size, uint32 *resume_hnd,
+ uint32 *dos_error,
+ ENUM_SRVC_STATUS **svcs, uint32 *num_svcs);
BOOL do_svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd);
/*The following definitions come from rpc_client/cli_wkssvc.c */
char *val_name, uint32 val_type, BUFFER2 *value);
void display_reg_key_info(FILE *out_hnd, enum action_type action,
char *key_name, time_t key_mod_time);
+void display_svc_info(FILE *out_hnd, enum action_type action, ENUM_SRVC_STATUS *svc);
/*The following definitions come from rpcclient/rpcclient.c */
BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum,
POLICY_HND *hnd,
uint32 services_type, uint32 services_state,
- uint32 buf_size, uint32 *resume_hnd,
- ENUM_SRVC_STATUS **svcs)
+ uint32 *buf_size, uint32 *resume_hnd,
+ uint32 *dos_error,
+ ENUM_SRVC_STATUS **svcs, uint32 *num_svcs)
{
prs_struct rbuf;
prs_struct buf;
SVC_Q_ENUM_SVCS_STATUS q_o;
BOOL valid_pol = False;
- if (hnd == NULL) return False;
+ if (hnd == NULL || buf_size == NULL || dos_error == NULL || num_svcs == NULL)
+ {
+ return False;
+ }
prs_init(&buf , 1024, 4, SAFETY_MARGIN, False);
prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True );
make_svc_q_enum_svcs_status(&q_o, hnd,
services_type, services_state,
- buf_size, *resume_hnd);
+ *buf_size, *resume_hnd);
/* turn parameters into data stream */
svc_io_q_enum_svcs_status("", &q_o, &buf, 0);
{
/* report error code */
DEBUG(0,("SVC_ENUM_SVCS_STATUS: %s\n", smb_err_msg(ERRDOS, r_o.dos_status)));
- p = r_o.dos_status != ERRmoredata;
+ p = r_o.dos_status == ERRmoredata;
}
if (p)
{
(*svcs) = r_o.svcs;
+ (*num_svcs) = r_o.num_svcs;
(*resume_hnd) = get_enum_hnd(&r_o.resume_hnd);
+ (*buf_size) = r_o.more_buf_size;
+ (*dos_error) = r_o.dos_status;
valid_pol = True;
}
}
BOOL res1 = True;
int i;
uint32 resume_hnd = 0;
+ uint32 buf_size = 0;
+ uint32 dos_error = 0;
ENUM_SRVC_STATUS *svcs = NULL;
+ uint32 num_svcs = 0;
POLICY_HND sc_man_pol;
- fstring full_keyname;
+
fstring srv_name;
fstrcpy(srv_name, "\\\\");
do
{
+ buf_size += 0x800;
+
/* enumerate services */
res1 = res ? do_svc_enum_svcs(smb_cli, fnum,
&sc_man_pol,
0x00000030, 0x00000003,
- 0x00000080, &resume_hnd, &svcs) : False;
-
- } while (resume_hnd != 0);
+ &buf_size, &resume_hnd, &dos_error,
+ &svcs, &num_svcs) : False;
- if (svcs != NULL)
- {
- free(svcs);
- }
+ } while (dos_error == ERRmoredata);
-#if 0
- if (res1 && num_subkeys > 0)
+ if (res1 && dos_error == 0x0 && num_svcs > 0 && svcs != NULL)
{
- fprintf(out_hnd,"Subkeys\n");
- fprintf(out_hnd,"-------\n");
+ fprintf(out_hnd,"Services\n");
+ fprintf(out_hnd,"--------\n");
}
- for (i = 0; i < num_subkeys; i++)
+ for (i = 0; i < num_svcs && svcs != NULL; i++)
{
- BOOL res2 = True;
- /*
- * enumerate key
- */
-
- /* enum key */
- res2 = res2 ? do_svc_enum_key(smb_cli, fnum, &key_pol,
- i, enum_name,
- &enum_unk1, &enum_unk2,
- &key_mod_time) : False;
-
- if (res2)
+ if (res1)
{
- display_svc_key_info(out_hnd, ACTION_HEADER , enum_name, key_mod_time);
- display_svc_key_info(out_hnd, ACTION_ENUMERATE, enum_name, key_mod_time);
- display_svc_key_info(out_hnd, ACTION_FOOTER , enum_name, key_mod_time);
+ display_svc_info(out_hnd, ACTION_HEADER , &svcs[i]);
+ display_svc_info(out_hnd, ACTION_ENUMERATE, &svcs[i]);
+ display_svc_info(out_hnd, ACTION_FOOTER , &svcs[i]);
}
-
}
+ if (svcs != NULL)
+ {
+ free(svcs);
}
-#endif
+
res = res ? do_svc_close(smb_cli, fnum, &sc_man_pol) : False;
/* close the session */
}
}
+/****************************************************************************
+ display structure
+ ****************************************************************************/
+void display_svc_info(FILE *out_hnd, enum action_type action, ENUM_SRVC_STATUS *svc)
+{
+ switch (action)
+ {
+ case ACTION_HEADER:
+ {
+ break;
+ }
+ case ACTION_ENUMERATE:
+ {
+ fprintf(out_hnd, "\t%s:", unistr2(svc->uni_srvc_name .buffer)); /* service name unicode string */
+ fprintf(out_hnd, "\t%s\n", unistr2(svc->uni_disp_name .buffer)); /* display name unicode string */
+ break;
+ }
+ case ACTION_FOOTER:
+ {
+ break;
+ }
+ }
+}
+
#if COPY_THIS_TEMPLATE
/****************************************************************************
display structure