s3-rpcclient: allow to set flags in cmd_ntsvcs_get_dev_list().
[kai/samba.git] / source3 / rpcclient / cmd_ntsvcs.c
index 04e367abdb59ddb4cadae14f2edf6476f8a73308..a345cdc8bf0b3d84a83bd5a4ee47745a9fa80d90 100644 (file)
@@ -75,30 +75,142 @@ static WERROR cmd_ntsvcs_validate_dev_inst(struct rpc_pipe_client *cli,
        return werr;
 }
 
-static WERROR cmd_ntsvcs_get_device_list_size(struct rpc_pipe_client *cli,
-                                             TALLOC_CTX *mem_ctx,
-                                             int argc,
-                                             const char **argv)
+static WERROR cmd_ntsvcs_hw_prof_flags(struct rpc_pipe_client *cli,
+                                      TALLOC_CTX *mem_ctx,
+                                      int argc,
+                                      const char **argv)
 {
        NTSTATUS status;
        WERROR werr;
-       const char *devicename = NULL;
+       const char *devicepath = NULL;
+       uint32_t profile_flags = 0;
+       uint16_t veto_type = 0;
+       const char *unk5 = NULL;
+       const char *unk5a = NULL;
+
+       if (argc < 2) {
+               printf("usage: %s [devicepath]\n", argv[0]);
+               return WERR_OK;
+       }
+
+       devicepath = argv[1];
+
+       status = rpccli_PNP_HwProfFlags(cli, mem_ctx,
+                                       0,
+                                       devicepath,
+                                       0,
+                                       &profile_flags,
+                                       &veto_type,
+                                       unk5,
+                                       &unk5a,
+                                       0,
+                                       0,
+                                       &werr);
+       if (!NT_STATUS_IS_OK(status)) {
+               return ntstatus_to_werror(status);
+       }
+
+       return werr;
+}
+
+static WERROR cmd_ntsvcs_get_hw_prof_info(struct rpc_pipe_client *cli,
+                                         TALLOC_CTX *mem_ctx,
+                                         int argc,
+                                         const char **argv)
+{
+       NTSTATUS status;
+       WERROR werr;
+       uint32_t idx = 0;
+       struct PNP_HwProfInfo info;
+       uint32_t size = 0, flags = 0;
+
+       ZERO_STRUCT(info);
+
+       status = rpccli_PNP_GetHwProfInfo(cli, mem_ctx,
+                                         idx,
+                                         &info,
+                                         size,
+                                         flags,
+                                         &werr);
+       if (!NT_STATUS_IS_OK(status)) {
+               return ntstatus_to_werror(status);
+       }
+
+       return werr;
+}
+
+static WERROR cmd_ntsvcs_get_dev_reg_prop(struct rpc_pipe_client *cli,
+                                         TALLOC_CTX *mem_ctx,
+                                         int argc,
+                                         const char **argv)
+{
+       NTSTATUS status;
+       WERROR werr;
+       const char *devicepath = NULL;
+       uint32_t property = DEV_REGPROP_DESC;
+       uint32_t reg_data_type = REG_NONE;
+       uint8_t *buffer;
+       uint32_t buffer_size = 0;
+       uint32_t needed = 0;
        uint32_t flags = 0;
+
+       if (argc < 2) {
+               printf("usage: %s [devicepath] [buffersize]\n", argv[0]);
+               return WERR_OK;
+       }
+
+       devicepath = argv[1];
+
+       if (argc >= 3) {
+               buffer_size = atoi(argv[2]);
+               needed = buffer_size;
+       }
+
+       buffer = talloc_array(mem_ctx, uint8_t, buffer_size);
+       W_ERROR_HAVE_NO_MEMORY(buffer);
+
+       status = rpccli_PNP_GetDeviceRegProp(cli, mem_ctx,
+                                            devicepath,
+                                            property,
+                                            &reg_data_type,
+                                            buffer,
+                                            &buffer_size,
+                                            &needed,
+                                            flags,
+                                            &werr);
+       if (!NT_STATUS_IS_OK(status)) {
+               return ntstatus_to_werror(status);
+       }
+
+       return werr;
+}
+
+static WERROR cmd_ntsvcs_get_dev_list_size(struct rpc_pipe_client *cli,
+                                          TALLOC_CTX *mem_ctx,
+                                          int argc,
+                                          const char **argv)
+{
+       NTSTATUS status;
+       WERROR werr;
        uint32_t size = 0;
+       uint32_t flags = 0;
+       const char *filter = NULL;
 
-       if (argc < 2 || argc > 4) {
-               printf("usage: %s [devicename] <flags>\n", argv[0]);
+       if (argc > 3) {
+               printf("usage: %s [filter] [flags]\n", argv[0]);
                return WERR_OK;
        }
 
-       devicename = argv[1];
+       if (argc >= 2) {
+               filter = argv[1];
+       }
 
        if (argc >= 3) {
                flags = atoi(argv[2]);
        }
 
        status = rpccli_PNP_GetDeviceListSize(cli, mem_ctx,
-                                             devicename,
+                                             filter,
                                              &size,
                                              flags,
                                              &werr);
@@ -106,19 +218,69 @@ static WERROR cmd_ntsvcs_get_device_list_size(struct rpc_pipe_client *cli,
                return ntstatus_to_werror(status);
        }
 
-       if (W_ERROR_IS_OK(werr)) {
-               printf("size: %d\n", size);
-       }
+       printf("size: %d\n", size);
 
        return werr;
 }
 
+static WERROR cmd_ntsvcs_get_dev_list(struct rpc_pipe_client *cli,
+                                     TALLOC_CTX *mem_ctx,
+                                     int argc,
+                                     const char **argv)
+{
+       NTSTATUS status;
+       WERROR werr;
+       const char *filter = NULL;
+       uint16_t *buffer = NULL;
+       uint32_t length = 0;
+       uint32_t flags = 0;
+
+       if (argc > 4) {
+               printf("usage: %s [filter] [length] [flags]\n", argv[0]);
+               return WERR_OK;
+       }
+
+       if (argc >= 2) {
+               filter = argv[1];
+       }
+
+       if (argc >= 3) {
+               length = atoi(argv[2]);
+       }
+
+       if (argc >= 4) {
+               flags = atoi(argv[3]);
+       }
+
+       buffer = talloc(mem_ctx, uint16_t);
+       if (!buffer) {
+               return WERR_NOMEM;
+       }
+
+       status = rpccli_PNP_GetDeviceList(cli, mem_ctx,
+                                         filter,
+                                         buffer,
+                                         &length,
+                                         flags,
+                                         &werr);
+       if (!NT_STATUS_IS_OK(status)) {
+               return ntstatus_to_werror(status);
+       }
+
+       printf("devlist needs size: %d\n", length);
+
+       return werr;
+}
 
 struct cmd_set ntsvcs_commands[] = {
 
        { "NTSVCS" },
-       { "ntsvcs_getversion", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_version, PI_NTSVCS, NULL, "Query NTSVCS version", "" },
-       { "ntsvcs_validatedevinst", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_validate_dev_inst, PI_NTSVCS, NULL, "Query NTSVCS device instance", "" },
-       { "ntsvcs_getdevlistsize", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_device_list_size, PI_NTSVCS, NULL, "Query NTSVCS get device list", "" },
+       { "ntsvcs_getversion", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_version, &ndr_table_ntsvcs.syntax_id, NULL, "Query NTSVCS version", "" },
+       { "ntsvcs_validatedevinst", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_validate_dev_inst, &ndr_table_ntsvcs.syntax_id, NULL, "Query NTSVCS device instance", "" },
+       { "ntsvcs_hwprofflags", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_hw_prof_flags, &ndr_table_ntsvcs.syntax_id, NULL, "Query NTSVCS HW prof flags", "" },
+       { "ntsvcs_hwprofinfo", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_hw_prof_info, &ndr_table_ntsvcs.syntax_id, NULL, "Query NTSVCS HW prof info", "" },
+       { "ntsvcs_getdevregprop", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_dev_reg_prop, &ndr_table_ntsvcs.syntax_id, NULL, "Query NTSVCS device registry property", "" },
+       { "ntsvcs_getdevlistsize", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_dev_list_size, &ndr_table_ntsvcs.syntax_id, NULL, "Query NTSVCS device list size", "" },
+       { "ntsvcs_getdevlist", RPC_RTYPE_WERROR, NULL, cmd_ntsvcs_get_dev_list, &ndr_table_ntsvcs.syntax_id, NULL, "Query NTSVCS device list", "" },
        { NULL }
 };