Adapt to changes in Samba API's, fix formatting.
authorJelmer Vernooij <jelmer@samba.org>
Sun, 14 Sep 2008 14:39:57 +0000 (16:39 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 15 Sep 2008 15:40:24 +0000 (17:40 +0200)
source4/lib/wmi/tools/wmic.c
source4/lib/wmi/tools/wmis.c
source4/lib/wmi/wbemdata.c
source4/lib/wmi/wmi.h
source4/lib/wmi/wmicore.c

index 611a2dc36fd85881208d00dfc432a90cad9e15ac..3d5d654eb82e7927b8b4f58d0823eeac49679e2e 100644 (file)
@@ -1,6 +1,7 @@
 /*
    WMI Sample client
    Copyright (C) 2006 Andrzej Hajda <andrzej.hajda@wp.pl>
+   Copyright (C) 2008 Jelmer Vernooij <jelmer@samba.org>
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #include "librpc/gen_ndr/ndr_remact_c.h"
 #include "librpc/gen_ndr/ndr_epmapper_c.h"
 #include "librpc/gen_ndr/com_dcom.h"
-#include "librpc/rpc/dcerpc_table.h"
 
 #include "lib/com/dcom/dcom.h"
 #include "lib/com/proto.h"
 #include "lib/com/dcom/proto.h"
 
-struct WBEMCLASS;
-struct WBEMOBJECT;
-
-#include "wmi/wmi.h"
+#include "lib/wmi/wmi.h"
 
 struct program_args {
     char *hostname;
@@ -164,23 +161,11 @@ int main(int argc, char **argv)
        WERROR result;
        NTSTATUS status;
        struct IWbemServices *pWS = NULL;
+       struct BSTR queryLanguage, query;
 
         parse_args(argc, argv, &args);
 
-       dcerpc_init();
-       dcerpc_table_init();
-
-       dcom_proxy_IUnknown_init();
-       dcom_proxy_IWbemLevel1Login_init();
-       dcom_proxy_IWbemServices_init();
-       dcom_proxy_IEnumWbemClassObject_init();
-       dcom_proxy_IRemUnknown_init();
-       dcom_proxy_IWbemFetchSmartEnum_init();
-       dcom_proxy_IWbemWCOSmartEnum_init();
-
-       struct com_context *ctx = NULL;
-       com_init_ctx(&ctx, NULL);
-       dcom_client_init(ctx, cmdline_credentials);
+       wmi_init(&ctx, cmdline_credentials);
 
        if (!args.ns)
                args.ns = "root\\cimv2";
@@ -188,7 +173,9 @@ int main(int argc, char **argv)
        WERR_CHECK("Login to remote object.");
 
        struct IEnumWbemClassObject *pEnum = NULL;
-       result = IWbemServices_ExecQuery(pWS, ctx, "WQL", args.query, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_ENSURE_LOCATABLE, NULL, &pEnum);
+       queryLanguage.data = "WQL";
+       query.data = args.query;
+       result = IWbemServices_ExecQuery(pWS, ctx, queryLanguage, query, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_ENSURE_LOCATABLE, NULL, &pEnum);
        WERR_CHECK("WMI query execute.");
 
        IEnumWbemClassObject_Reset(pEnum, ctx);
index 72ca4ebdfe0ae64156fc0e59af175104f7044345..2b7abbb7bc72e55da3a4c21567f3063556c130a4 100644 (file)
@@ -141,10 +141,13 @@ WERROR WBEM_RemoteExecute(struct IWbemServices *pWS, const char *cmdline, uint32
        WERROR result;
        union CIMVAR v;
        TALLOC_CTX *ctx;
+       struct BSTR objectPath, methodName;
 
        ctx = talloc_new(0);
 
-       result = IWbemServices_GetObject(pWS, ctx, "Win32_Process", 
+       objectPath.data = "Win32_Process";
+
+       result = IWbemServices_GetObject(pWS, ctx, objectPath,
                                         WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &wco, NULL);
        WERR_CHECK("GetObject.");
 
@@ -158,7 +161,8 @@ WERROR WBEM_RemoteExecute(struct IWbemServices *pWS, const char *cmdline, uint32
        result = IWbemClassObject_Put(in, ctx, "CommandLine", 0, &v, 0);
        WERR_CHECK("IWbemClassObject_Put(CommandLine).");
 
-       result = IWbemServices_ExecMethod(pWS, ctx, "Win32_Process", "Create", 0, NULL, in, &out, 
+       methodName.data = "Create";
+       result = IWbemServices_ExecMethod(pWS, ctx, objectPath, methodName, 0, NULL, in, &out, 
                                          NULL);
        WERR_CHECK("IWbemServices_ExecMethod.");
 
@@ -181,24 +185,12 @@ int main(int argc, char **argv)
        struct IWbemServices *pWS = NULL;
         struct IEnumWbemClassObject *pEnum = NULL;
        uint32_t cnt;
+       struct BSTR queryLanguage;
+       struct BSTR query;
 
         parse_args(argc, argv, &args);
 
-       dcerpc_init();
-       ndr_table_init();
-
-       dcom_proxy_IUnknown_init();
-       dcom_proxy_IWbemLevel1Login_init();
-       dcom_proxy_IWbemServices_init();
-       dcom_proxy_IEnumWbemClassObject_init();
-       dcom_proxy_IRemUnknown_init();
-       dcom_proxy_IWbemFetchSmartEnum_init();
-       dcom_proxy_IWbemWCOSmartEnum_init();
-       dcom_proxy_IWbemClassObject_init();
-
-       com_init_ctx(&ctx, NULL);
-       dcom_client_init(ctx, cmdline_credentials);
-
+       wmi_init(&ctx, cmdline_credentials);
        result = WBEM_ConnectServer(ctx, args.hostname, "root\\cimv2", 0, 0, 0, 0, 0, 0, &pWS);
        WERR_CHECK("WBEM_ConnectServer.");
 
@@ -208,8 +200,10 @@ int main(int argc, char **argv)
        printf("2: ReturnCode: %d\n", cnt);
 
        printf("3: Monitoring directory C:\\wmi_test_dir_tmp. Please create/delete files in that directory to see notifications, after 4 events program quits.\n");
-        result = IWbemServices_ExecNotificationQuery(pWS, ctx, "WQL", 
-               "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent= 'Win32_Directory.Name=\"C:\\\\\\\\wmi_test_dir_tmp\"'", WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum);
+       query.data = "SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent= 'Win32_Directory.Name=\"C:\\\\\\\\wmi_test_dir_tmp\"'";
+       queryLanguage.data = "WQL";
+        result = IWbemServices_ExecNotificationQuery(pWS, ctx, queryLanguage, 
+               query, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum);
         WERR_CHECK("WMI query execute.");
        for (cnt = 0; cnt < 4; ++cnt) {
                struct WbemClassObject *co;
index ffe1bf664831e23e6933dd0178bd60ec6c5cc160..b973e1555dd531b44a72300d7dee514662127ed4 100644 (file)
@@ -31,7 +31,7 @@
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "lib/talloc/talloc.h"
 #include "libcli/composite/composite.h"
-#include "wmi/proto.h"
+#include "lib/wmi/wmi.h"
 
 NTSTATUS ndr_pull_WbemClassObject_Object(struct ndr_pull *ndr, int ndr_flags, struct WbemClassObject *r);
 void duplicate_CIMVAR(TALLOC_CTX *mem_ctx, const union CIMVAR *src, union CIMVAR *dst, enum CIMTYPE_ENUMERATION cimtype);
@@ -54,8 +54,6 @@ void duplicate_WbemClassObject(TALLOC_CTX *mem_ctx, const struct WbemClassObject
 #define NDR_CHECK_CONST(val, exp) NDR_CHECK_EXPR((val) == (exp))
 #define NDR_CHECK_RSTRING(rstring) NDR_CHECK_EXPR((rstring) >= 0)
 
-#define NTERR_CHECK(call) status = call; if (!NT_STATUS_IS_OK(status)) goto end;
-
 enum {
        DATATYPE_CLASSOBJECT = 2,
        DATATYPE_OBJECT = 3,
@@ -63,17 +61,14 @@ enum {
        COFLAG_IS_CLASS = 4,
 };
 
-static NTSTATUS marshal(struct IUnknown *pv, struct OBJREF *o)
+static enum ndr_err_code marshal(TALLOC_CTX *mem_ctx, struct IUnknown *pv, struct OBJREF *o)
 {
        struct ndr_push *ndr;
-       NTSTATUS status;
        struct WbemClassObject *wco;
-       TALLOC_CTX *mem_ctx;
        struct MInterfacePointer *mp;
 
        mp = (struct MInterfacePointer *)((char *)o - offsetof(struct MInterfacePointer, obj)); // FIXME:high remove this Mumbo Jumbo
        wco = pv->object_data;
-       mem_ctx = talloc_new(0);
        ndr = talloc_zero(mem_ctx, struct ndr_push);
        ndr->flags = 0;
        ndr->alloc_size = 1024;
@@ -81,15 +76,15 @@ static NTSTATUS marshal(struct IUnknown *pv, struct OBJREF *o)
 
        if (wco) {
                uint32_t ofs;
-               NTERR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0x12345678));
-               NTERR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
-               NTERR_CHECK(ndr_push_WbemClassObject(ndr, NDR_SCALARS | NDR_BUFFERS, wco));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0x12345678));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+               NDR_CHECK(ndr_push_WbemClassObject(ndr, NDR_SCALARS | NDR_BUFFERS, wco));
                ofs = ndr->offset;
                ndr->offset = 4;
-               NTERR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ofs - 8));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ofs - 8));
                ndr->offset = ofs;
        } else {
-               NTERR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, 0));
        }
        o->u_objref.u_custom.pData = talloc_realloc(mp, ndr->data, uint8_t, ndr->offset);
        o->u_objref.u_custom.size = ndr->offset;
@@ -97,17 +92,14 @@ static NTSTATUS marshal(struct IUnknown *pv, struct OBJREF *o)
         if (DEBUGLVL(9)) {
                NDR_PRINT_DEBUG(WbemClassObject, wco);
        }
-end:
-       talloc_free(mem_ctx);
-       return status;
+       return NDR_ERR_SUCCESS;
 }
 
-static NTSTATUS unmarshal(struct OBJREF *o, struct IUnknown **pv)
+static enum ndr_err_code unmarshal(TALLOC_CTX *mem_ctx, struct OBJREF *o, struct IUnknown **pv)
 {
        struct ndr_pull *ndr;
-       TALLOC_CTX *mem_ctx;
        struct WbemClassObject *wco;
-       NTSTATUS status;
+       enum ndr_err_code ndr_err;
        uint32_t u;
 
        mem_ctx = talloc_new(0);
@@ -116,42 +108,37 @@ static NTSTATUS unmarshal(struct OBJREF *o, struct IUnknown **pv)
        ndr->data = o->u_objref.u_custom.pData;
        ndr->data_size = o->u_objref.u_custom.size;
 
-       NTERR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &u));
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &u));
        if (!u) {
                talloc_free(*pv);
                *pv = NULL;
-               status = NT_STATUS_OK;
-               goto end;
+               return NDR_ERR_SUCCESS;
        }
-       NTERR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &u));
+       NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &u));
        if (u + 8 > ndr->data_size) {
                DEBUG(1, ("unmarshall_IWbemClassObject: Incorrect data_size"));
-               status = NT_STATUS_BUFFER_TOO_SMALL;
-               goto end;
+               return NDR_ERR_BUFSIZE;
        }
        wco = talloc_zero(*pv, struct WbemClassObject);
        ndr->current_mem_ctx = wco;
-       status = ndr_pull_WbemClassObject(ndr, NDR_SCALARS | NDR_BUFFERS, wco);
+       ndr_err = ndr_pull_WbemClassObject(ndr, NDR_SCALARS | NDR_BUFFERS, wco);
 
-        if (NT_STATUS_IS_OK(status) && (DEBUGLVL(9))) {
+        if (NDR_ERR_CODE_IS_SUCCESS(ndr_err) && (DEBUGLVL(9))) {
                NDR_PRINT_DEBUG(WbemClassObject, wco);
         }
 
-       if (NT_STATUS_IS_OK(status)) {
+       if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                (*pv)->object_data = wco;
        } else {
                talloc_free(wco);
        }
-end:
-       talloc_free(mem_ctx);
-       return status;
+       return NDR_ERR_SUCCESS;
 }
 
 WERROR dcom_IWbemClassObject_from_WbemClassObject(struct com_context *ctx, struct IWbemClassObject **_p, struct WbemClassObject *wco)
 {
        struct IWbemClassObject *p;
 
-
        p = talloc_zero(ctx, struct IWbemClassObject);
        p->ctx = ctx;
        p->obj.signature = 0x574f454d;
@@ -490,20 +477,18 @@ struct IEnumWbemClassObject_data {
        struct pair_guid_ptr *cache;
 };
 
-static NTSTATUS WBEMDATA_Parse(uint8_t *data, uint32_t size, struct IEnumWbemClassObject *d, uint32_t uCount, struct WbemClassObject **apObjects)
+static enum ndr_err_code WBEMDATA_Parse(TALLOC_CTX *mem_ctx, uint8_t *data, uint32_t size, struct IEnumWbemClassObject *d, uint32_t uCount, struct WbemClassObject **apObjects)
 {
        struct ndr_pull *ndr;
-       TALLOC_CTX *mem_ctx;
        uint32_t u, i, ofs_next;
        uint8_t u8, datatype;
        NTSTATUS status;
        struct GUID guid;
        struct IEnumWbemClassObject_data *ecod;
 
-       if (!uCount) return NT_STATUS_NOT_IMPLEMENTED;
+       if (!uCount) return NDR_ERR_BAD_SWITCH;
 
        ecod = d->object_data;
-       mem_ctx = talloc_new(0);
 
        ndr = talloc_zero(mem_ctx, struct ndr_pull);
        ndr->current_mem_ctx = d->ctx;
@@ -568,18 +553,14 @@ static NTSTATUS WBEMDATA_Parse(uint8_t *data, uint32_t size, struct IEnumWbemCla
                        break;
                default:
                        DEBUG(0, ("WBEMDATA_Parse: Data type %d not supported\n", datatype));
-                       status = NT_STATUS_NOT_SUPPORTED;
-                       goto end;
+                       return NDR_ERR_BAD_SWITCH;
                }
                ndr->offset = ofs_next;
                if (DEBUGLVL(9)) {
                        NDR_PRINT_DEBUG(WbemClassObject, apObjects[i]);
                }
        }
-       status = NT_STATUS_OK;
-end:
-       talloc_free(mem_ctx);
-       return status;
+       return NDR_ERR_SUCCESS;
 }
 
 struct composite_context *dcom_proxy_IEnumWbemClassObject_Release_send(struct IUnknown *d, TALLOC_CTX *mem_ctx);
@@ -619,9 +600,7 @@ WERROR IEnumWbemClassObject_SmartNext(struct IEnumWbemClassObject *d, TALLOC_CTX
        }
 
        if (data) {
-               status = WBEMDATA_Parse(data, size, d, *puReturned, apObjects);
-               result = ntstatus_to_werror(status);
-               WERR_CHECK("WBEMDATA_Parse.");
+               NDR_CHECK(WBEMDATA_Parse(mem_ctx, data, size, d, *puReturned, apObjects));
        }
 end:
        if (!W_ERROR_IS_OK(result)) {
index 32cc88efd5c53f70c536e15c35a5ee25c5f69ed3..085e01215ff230338afe9f2d14a0d4b4117cdb89 100644 (file)
@@ -52,6 +52,7 @@ WERROR WbemClassObject_Get(struct WbemClassObject *d, TALLOC_CTX *mem_ctx, const
 WERROR IWbemClassObject_Put(struct IWbemClassObject *d, TALLOC_CTX *mem_ctx, const char *name, uint32_t flags, union CIMVAR *val, enum CIMTYPE_ENUMERATION cimtype);
 WERROR IEnumWbemClassObject_SmartNext(struct IEnumWbemClassObject *d, TALLOC_CTX *mem_ctx, int32_t lTimeout, uint32_t uCount, struct WbemClassObject **apObjects, uint32_t *puReturned);
 struct composite_context *dcom_proxy_IEnumWbemClassObject_Release_send(struct IUnknown *d, TALLOC_CTX *mem_ctx);
-NTSTATUS dcom_proxy_IWbemClassObject_init(void);
+
+void wmi_init(struct com_context **ctx, struct cli_credentials *credentials);
 
 #endif
index cdfe037b6919b1432e98a1b3526249165c56d6cb..fbd6b339bf10972073d00ec802f16bc663d1f161 100644 (file)
@@ -24,6 +24,9 @@
 #include "lib/com/dcom/dcom.h"
 #include "librpc/gen_ndr/wmi.h"
 #include "librpc/gen_ndr/com_wmi.h"
+#include "librpc/rpc/dcerpc.h"
+#include "librpc/ndr/ndr_table.h"
+#include "param/param.h"
 
 struct IWbemServices;
 struct IWbemContext;
@@ -34,8 +37,20 @@ struct IWbemContext;
                         } else { \
                             DEBUG(1, ("OK   : %s\n", msg)); \
                         }
+
+void wmi_init(struct com_context **ctx, struct cli_credentials *credentials)
+{
+       dcerpc_init();
+       ndr_table_init();
+
+       /* FIXME: Register DCOM proxies? */
+
+       com_init_ctx(ctx, NULL);
+       dcom_client_init(*ctx, credentials);
+}
+
 /** FIXME: Use credentials struct rather than user/password here */
-WERROR WBEM_ConnectServer(struct com_context *ctx, const char *server, const char *nspace, 
+WERROR WBEM_ConnectServer(struct com_context *ctx, const char *server, const uint16_t *nspace, 
                          const char *user, const char *password, 
                          const char *locale, uint32_t flags, const char *authority, 
                          struct IWbemContext* wbem_ctx, struct IWbemServices** services)
@@ -52,7 +67,7 @@ WERROR WBEM_ConnectServer(struct com_context *ctx, const char *server, const cha
 
                 cred = talloc_asprintf(NULL, "%s%%%s", user, password);
                 cc = cli_credentials_init(cred);
-                cli_credentials_set_conf(cc);
+                cli_credentials_set_conf(cc, global_loadparm);
                 cli_credentials_parse_string(cc, cred, CRED_SPECIFIED);
                 dcom_set_server_credentials(ctx, server, cc);
                 talloc_free(cred);