2008-06-17 14:14:51 +02:00
/*
W M I I m p l e m e n t a t i o n
C o p y r i g h t ( C ) 2006 A n d r z e j H a j d a < a n d r z e j . h a j d a @ w p . p l >
C o p y r i g h t ( C ) 2008 J e l m e r V e r n o o i j < j e l m e r @ s a m b a . o r g >
T h i s p r o g r a m is f r e e s o f t w a r e ; y o u c a n r e d i s t r i b u t e i t and / or m o d i f y
i t u n d e r t h e t e r m s of t h e G N U G e n e r a l Public L i c e n s e as p u b l i s h e d by
t h e F r e e S o f t w a r e F o u n d a t i o n ; e i t h e r version 2 of t h e L i c e n s e , or
( at y o u r option ) any l a t e r version .
T h i s p r o g r a m is d i s t r i b u t e d in t h e h o p e t h a t i t w i l l b e u s e f u l ,
b u t W I T H O U T ANY W A R R A N T Y ; w i t h o u t e v e n t h e i m p l i e d w a r r a n t y of
M E R C H A N T A B I L I T Y or F I T N E S S FOR A P A R T I C U L A R P U R P O S E . S e e t h e
G N U G e n e r a l Public L i c e n s e for m o r e d e t a i l s .
Y o u s h o u l d h a v e r e c e i v e d a c o p y of t h e G N U G e n e r a l Public L i c e n s e
a l o n g with t h i s p r o g r a m ; if not , write to t h e F r e e S o f t w a r e
F o u n d a t i o n , I n c . , 675 M a s s Ave , C a m b r i d g e , M A 02139 , U S A .
* /
2008-09-14 22:04:03 +02:00
% m o d u l e w m i
2008-05-07 16:13:46 +02:00
% i n c l u d e "typemaps.i"
2008-09-14 22:04:03 +02:00
% i n c l u d e "libcli/util/errors.i"
2008-06-17 14:14:51 +02:00
% import "stdint.i"
2008-09-12 19:55:49 +02:00
% import "lib/talloc/talloc.i"
2008-05-07 16:13:46 +02:00
% r u n t i m e % {
void p u s h _ o b j e c t ( P y O b j e c t * * s t a c k , P y O b j e c t * o )
{
if ( ( ! * s t a c k ) | | ( * s t a c k = = P y _ N o n e ) ) {
* s t a c k = o ;
} else {
P y O b j e c t * o 2 , * o 3 ;
if ( ! P y T u p l e _ C h e c k ( * s t a c k ) ) {
o 2 = * s t a c k ;
* s t a c k = P y T u p l e _ N e w ( 1 ) ;
P y T u p l e _ S e t I t e m ( * s t a c k , 0 , o 2 ) ;
}
o 3 = P y T u p l e _ N e w ( 1 ) ;
P y T u p l e _ S e t I t e m ( o 3 , 0 , o ) ;
o 2 = * s t a c k ;
* s t a c k = P y S e q u e n c e _ C o n c a t ( o 2 , o 3 ) ;
P y _ D E C R E F ( o 2 ) ;
P y _ D E C R E F ( o 3 ) ;
}
}
% }
% {
# i n c l u d e "includes.h"
# i n c l u d e "librpc/gen_ndr/misc.h"
# i n c l u d e "librpc/rpc/dcerpc.h"
# i n c l u d e "lib/com/dcom/dcom.h"
# i n c l u d e "librpc/gen_ndr/com_dcom.h"
2008-09-14 22:04:03 +02:00
# i n c l u d e "lib/wmi/wmi.h"
2008-05-07 16:13:46 +02:00
W E R R O R W B E M _ C o n n e c t S e r v e r ( s t r u c t c o m _ c o n t e x t * c t x , c o n s t char * server , c o n s t char * n s p a c e , c o n s t char * user , c o n s t char * p a s s w o r d ,
c o n s t char * l o c a l e , u i n t 32 _ t f l a g s , c o n s t char * a u t h o r i t y , s t r u c t I W b e m C o n t e x t * w b e m _ c t x , s t r u c t I W b e m S e r v i c e s * * s e r v i c e s ) ;
W E R R O R I E n u m W b e m C l a s s O b j e c t _ S m a r t N e x t ( s t r u c t I E n u m W b e m C l a s s O b j e c t * d , T A L L O C _ C T X * m e m _ c t x , i n t 32 _ t l T i m e o u t , u i n t 32 _ t u C o u n t ,
s t r u c t W b e m C l a s s O b j e c t * * a p O b j e c t s , u i n t 32 _ t * p u R e t u r n e d ) ;
static P y O b j e c t * P y O b j e c t _ F r o m C V A R ( u i n t 32 _ t c i m t y p e , union C I M V A R * c v a r ) ;
static P y O b j e c t * P y S W b e m O b j e c t _ F r o m W b e m C l a s s O b j e c t ( s t r u c t W b e m C l a s s O b j e c t * w c o ) ;
static s t r u c t c o m _ c o n t e x t * c o m _ c t x ;
static P y O b j e c t * C o m E r r o r ;
static P y O b j e c t * m o d _ w i n 32 _ c l i e n t ;
static P y O b j e c t * m o d _ p y w i n t y p e s ;
2008-09-15 04:29:54 +02:00
t y p e def s t r u c t I U n k n o w n I U n k n o w n ;
t y p e def s t r u c t I W b e m S e r v i c e s I W b e m S e r v i c e s ;
t y p e def s t r u c t I W b e m C l a s s O b j e c t I W b e m C l a s s O b j e c t ;
t y p e def s t r u c t I E n u m W b e m C l a s s O b j e c t I E n u m W b e m C l a s s O b j e c t ;
2008-05-07 16:13:46 +02:00
% }
% w r a p p e r % {
# define R E T U R N _ C V A R _ A R R A Y ( f m t , a r r ) { \
P y O b j e c t * l , * o ; \
u i n t 32 _ t i ; \
\
if ( ! a r r ) { \
P y _ I N C R E F ( P y _ N o n e ) ; \
return P y _ N o n e ; \
} \
l = P y L i s t _ N e w ( a r r - > count ) ; \
if ( ! l ) return NULL ; \
for ( i = 0 ; i < a r r - > count ; + + i ) { \
o = _ P y _ B u i l d V a l u e ( f m t , a r r - > item [ i ] ) ; \
if ( ! o ) { \
P y _ D E C R E F ( l ) ; \
return NULL ; \
} \
P y L i s t _ S E T _ I T E M ( l , i , o ) ; \
} \
return l ; \
}
static P y O b j e c t * _ P y _ B u i l d V a l u e ( char * s t r , . . . )
{
P y O b j e c t * r e s u l t = NULL ;
v a _ l i s t l s t ;
v a _ s t a r t ( l s t , s t r ) ;
if ( s t r && *str == 'I') {
u i n t 32 _ t value = v a _ a r g ( l s t , u i n t 32 _ t ) ;
if ( value & 0x80000000) {
r e s u l t = P y _ B u i l d V a l u e ( "L" , ( l o n g ) value ) ;
} else {
r e s u l t = P y _ B u i l d V a l u e ( "i" , value ) ;
}
} else {
r e s u l t = P y _ V a B u i l d V a l u e ( s t r , l s t ) ;
}
v a _ e n d ( l s t ) ;
return r e s u l t ;
}
static P y O b j e c t * P y O b j e c t _ F r o m C V A R ( u i n t 32 _ t c i m t y p e , union C I M V A R * c v a r )
{
s w i t c h ( c i m t y p e ) {
case C I M _ S I N T 8 : return P y _ B u i l d V a l u e ( "b" , c v a r - > v _ s i n t 8 ) ;
case C I M _ U I N T 8 : return P y _ B u i l d V a l u e ( "B" , c v a r - > v _ u i n t 8 ) ;
case C I M _ S I N T 16 : return P y _ B u i l d V a l u e ( "h" , c v a r - > v _ s i n t 16 ) ;
case C I M _ U I N T 16 : return P y _ B u i l d V a l u e ( "H" , c v a r - > v _ u i n t 16 ) ;
case C I M _ S I N T 32 : return P y _ B u i l d V a l u e ( "i" , c v a r - > v _ s i n t 32 ) ;
case C I M _ U I N T 32 : return _ P y _ B u i l d V a l u e ( "I" , c v a r - > v _ u i n t 32 ) ;
case C I M _ S I N T 64 : return P y _ B u i l d V a l u e ( "L" , c v a r - > v _ s i n t 64 ) ;
case C I M _ U I N T 64 : return P y _ B u i l d V a l u e ( "K" , c v a r - > v _ u i n t 64 ) ;
case C I M _ R E A L 32 : return P y _ B u i l d V a l u e ( "f" , c v a r - > v _ r e a l 32 ) ;
case C I M _ R E A L 64 : return P y _ B u i l d V a l u e ( "d" , c v a r - > v _ r e a l 64 ) ;
case C I M _ B O O L E A N : return P y _ B u i l d V a l u e ( "h" , c v a r - > v _ b o o l e a n ) ;
case C I M _ S T R I N G : return P y _ B u i l d V a l u e ( "s" , c v a r - > v _ s t r i n g ) ;
case C I M _ D A T E T I M E : return P y _ B u i l d V a l u e ( "s" , c v a r - > v _ d a t e t i m e ) ;
case C I M _ R E F E R E N C E : return P y _ B u i l d V a l u e ( "s" , c v a r - > v _ r e f e r e n c e ) ;
case C I M _ O B J E C T : return P y S W b e m O b j e c t _ F r o m W b e m C l a s s O b j e c t ( c v a r - > v _ o b j e c t ) ;
case C I M _ A R R _ S I N T 8 : R E T U R N _ C V A R _ A R R A Y ( "b" , c v a r - > a _ s i n t 8 ) ;
case C I M _ A R R _ U I N T 8 : R E T U R N _ C V A R _ A R R A Y ( "B" , c v a r - > a _ u i n t 8 ) ;
case C I M _ A R R _ S I N T 16 : R E T U R N _ C V A R _ A R R A Y ( "h" , c v a r - > a _ s i n t 16 ) ;
case C I M _ A R R _ U I N T 16 : R E T U R N _ C V A R _ A R R A Y ( "H" , c v a r - > a _ u i n t 16 ) ;
case C I M _ A R R _ S I N T 32 : R E T U R N _ C V A R _ A R R A Y ( "i" , c v a r - > a _ s i n t 32 ) ;
case C I M _ A R R _ U I N T 32 : R E T U R N _ C V A R _ A R R A Y ( "I" , c v a r - > a _ u i n t 32 ) ;
case C I M _ A R R _ S I N T 64 : R E T U R N _ C V A R _ A R R A Y ( "L" , c v a r - > a _ s i n t 64 ) ;
case C I M _ A R R _ U I N T 64 : R E T U R N _ C V A R _ A R R A Y ( "K" , c v a r - > a _ u i n t 64 ) ;
case C I M _ A R R _ R E A L 32 : R E T U R N _ C V A R _ A R R A Y ( "f" , c v a r - > a _ r e a l 32 ) ;
case C I M _ A R R _ R E A L 64 : R E T U R N _ C V A R _ A R R A Y ( "d" , c v a r - > a _ r e a l 64 ) ;
case C I M _ A R R _ B O O L E A N : R E T U R N _ C V A R _ A R R A Y ( "h" , c v a r - > a _ b o o l e a n ) ;
case C I M _ A R R _ S T R I N G : R E T U R N _ C V A R _ A R R A Y ( "s" , c v a r - > a _ s t r i n g ) ;
case C I M _ A R R _ D A T E T I M E : R E T U R N _ C V A R _ A R R A Y ( "s" , c v a r - > a _ d a t e t i m e ) ;
case C I M _ A R R _ R E F E R E N C E : R E T U R N _ C V A R _ A R R A Y ( "s" , c v a r - > a _ r e f e r e n c e ) ;
default :
{
char * s t r ;
s t r = t a l l o c _ a s p r i n t f ( NULL , "Unsupported CIMTYPE(0x%04X)" , c i m t y p e ) ;
P y E r r _ S e t S t r i n g ( P y E x c _ R u n t i m e E r r o r , s t r ) ;
t a l l o c _ f r e e ( s t r ) ;
return NULL ;
}
}
}
# u n def R E T U R N _ C V A R _ A R R A Y
P y O b j e c t * P y S W b e m O b j e c t _ I n i t P r o p e r i t e s ( P y O b j e c t * o , s t r u c t W b e m C l a s s O b j e c t * w c o )
{
P y O b j e c t * p r o p e r t i e s ;
P y O b j e c t * a d d P r o p ;
u i n t 32 _ t i ;
i n t 32 _ t r ;
P y O b j e c t * r e s u l t ;
r e s u l t = NULL ;
p r o p e r t i e s = P y O b j e c t _ G e t A t t r S t r i n g ( o , "Properties_" ) ;
if ( ! p r o p e r t i e s ) return NULL ;
a d d P r o p = P y O b j e c t _ G e t A t t r S t r i n g ( p r o p e r t i e s , "Add" ) ;
if ( ! a d d P r o p ) {
P y _ D E C R E F ( p r o p e r t i e s ) ;
return NULL ;
}
for ( i = 0 ; i < w c o - > o b j _ c l a s s - > _ _ P R O P E R T Y _ C O U N T ; + + i ) {
P y O b j e c t * a r g s , * property ;
2008-09-15 04:29:54 +02:00
a r g s = P y _ B u i l d V a l u e ( "(si)" , w c o - > o b j _ c l a s s - > p r o p e r t i e s [ i ] . property . name , w c o - > o b j _ c l a s s - > p r o p e r t i e s [ i ] . property . d e s c - > c i m t y p e & CIM_TYPEMASK);
2008-05-07 16:13:46 +02:00
if ( ! a r g s ) g o t o f i n i s h ;
property = P y O b j e c t _ C a l l O b j e c t ( a d d P r o p , a r g s ) ;
P y _ D E C R E F ( a r g s ) ;
if ( ! property ) g o t o f i n i s h ;
if ( w c o - > f l a g s & WCF_INSTANCE) {
P y O b j e c t * value ;
if ( w c o - > i n s t a n c e - > d e f a u l t _ f l a g s [ i ] & 1) {
value = P y _ N o n e ;
P y _ I N C R E F ( P y _ N o n e ) ;
} else
2008-09-15 04:29:54 +02:00
value = P y O b j e c t _ F r o m C V A R ( w c o - > o b j _ c l a s s - > p r o p e r t i e s [ i ] . property . d e s c - > c i m t y p e & CIM_TYPEMASK, &wco->instance->data[i]);
2008-05-07 16:13:46 +02:00
if ( ! value ) {
P y _ D E C R E F ( property ) ;
g o t o f i n i s h ;
}
r = P y O b j e c t _ S e t A t t r S t r i n g ( property , "Value" , value ) ;
P y _ D E C R E F ( value ) ;
if ( r = = - 1 ) {
P y E r r _ S e t S t r i n g ( P y E x c _ R u n t i m e E r r o r , "Error setting value of property" ) ;
g o t o f i n i s h ;
}
}
P y _ D E C R E F ( property ) ;
}
P y _ I N C R E F ( P y _ N o n e ) ;
r e s u l t = P y _ N o n e ;
f i n i s h :
P y _ D E C R E F ( a d d P r o p ) ;
P y _ D E C R E F ( p r o p e r t i e s ) ;
return r e s u l t ;
}
static P y O b j e c t * P y S W b e m O b j e c t _ F r o m W b e m C l a s s O b j e c t ( s t r u c t W b e m C l a s s O b j e c t * w c o )
{
P y O b j e c t * s w o _ c l a s s , * s w o , * a r g s , * r e s u l t ;
s w o _ c l a s s = P y O b j e c t _ G e t A t t r S t r i n g ( m o d _ w i n 32 _ c l i e n t , "SWbemObject" ) ;
if ( ! s w o _ c l a s s ) return NULL ;
a r g s = P y T u p l e _ N e w ( 0 ) ;
if ( ! a r g s ) {
P y _ D E C R E F ( s w o _ c l a s s ) ;
return NULL ;
}
s w o = P y O b j e c t _ C a l l O b j e c t ( s w o _ c l a s s , a r g s ) ;
P y _ D E C R E F ( a r g s ) ;
P y _ D E C R E F ( s w o _ c l a s s ) ;
if ( ! s w o ) return NULL ;
r e s u l t = P y S W b e m O b j e c t _ I n i t P r o p e r i t e s ( s w o , w c o ) ;
if ( ! r e s u l t ) {
P y _ D E C R E F ( s w o ) ;
return NULL ;
}
P y _ D E C R E F ( r e s u l t ) ;
return s w o ;
}
% }
% t y p e m a p ( in , n u m i n p u t s = 0 ) s t r u c t c o m _ c o n t e x t * c t x {
$ 1 = c o m _ c t x ;
}
% t y p e m a p ( in , n u m i n p u t s = 0 ) s t r u c t I W b e m S e r v i c e s * * s e r v i c e s ( s t r u c t I W b e m S e r v i c e s * t e m p ) {
$ 1 = &temp;
}
% t y p e m a p ( a r g o u t ) s t r u c t I W b e m S e r v i c e s * * s e r v i c e s {
P y O b j e c t * o ;
o = S W I G _ N e w P o i n t e r O b j ( * $ 1 , S W I G T Y P E _ p _ I W b e m S e r v i c e s , 0 ) ;
p u s h _ o b j e c t ( &$result, o);
}
W E R R O R W B E M _ C o n n e c t S e r v e r ( s t r u c t c o m _ c o n t e x t * c t x , c o n s t char * server , c o n s t char * n s p a c e , c o n s t char * user , c o n s t char * p a s s w o r d ,
c o n s t char * l o c a l e , u i n t 32 _ t f l a g s , c o n s t char * a u t h o r i t y , s t r u c t I W b e m C o n t e x t * w b e m _ c t x , s t r u c t I W b e m S e r v i c e s * * s e r v i c e s ) ;
% t y p e m a p ( in , n u m i n p u t s = 0 ) s t r u c t I E n u m W b e m C l a s s O b j e c t * * p p E n u m ( s t r u c t I E n u m W b e m C l a s s O b j e c t * t e m p ) {
$ 1 = &temp;
}
% t y p e m a p ( a r g o u t ) s t r u c t I E n u m W b e m C l a s s O b j e c t * * p p E n u m {
P y O b j e c t * o ;
o = S W I G _ N e w P o i n t e r O b j ( * $ 1 , S W I G T Y P E _ p _ I E n u m W b e m C l a s s O b j e c t , 0 ) ;
p u s h _ o b j e c t ( &$result, o);
}
2008-09-15 04:29:54 +02:00
t y p e def s t r u c t I U n k n o w n {
% e x t e n d {
u i n t 32 _ t Release ( T A L L O C _ C T X * m e m _ c t x ) ;
}
} I U n k n o w n ;
2008-05-07 16:13:46 +02:00
2008-09-15 04:29:54 +02:00
% t y p e m a p ( in ) s t r u c t B S T R {
$ 1 . d a t a = P y S t r i n g _ A s S t r i n g ( $ input ) ;
}
2008-05-07 16:13:46 +02:00
2008-09-15 04:29:54 +02:00
t y p e def s t r u c t I W b e m S e r v i c e s {
% e x t e n d {
W E R R O R E x e c Q u e r y ( T A L L O C _ C T X * m e m _ c t x , s t r u c t B S T R s t r Q u e r y L a n g u a g e , s t r u c t B S T R s t r Q u e r y , i n t 32 _ t l F l a g s , s t r u c t I W b e m C o n t e x t * p C t x , s t r u c t I E n u m W b e m C l a s s O b j e c t * * p p E n u m ) ;
W E R R O R E x e c N o t i f i c a t i o n Q u e r y ( T A L L O C _ C T X * m e m _ c t x , s t r u c t B S T R s t r Q u e r y L a n g u a g e , s t r u c t B S T R s t r Q u e r y , i n t 32 _ t l F l a g s , s t r u c t I W b e m C o n t e x t * p C t x , s t r u c t I E n u m W b e m C l a s s O b j e c t * * p p E n u m ) ;
W E R R O R C r e a t e I n s t a n c e E n u m ( T A L L O C _ C T X * m e m _ c t x , s t r u c t B S T R s t r C l a s s ,
2008-05-07 16:13:46 +02:00
i n t 32 _ t l F l a g s , s t r u c t I W b e m C o n t e x t * p C t x , s t r u c t I E n u m W b e m C l a s s O b j e c t * * p p E n u m ) ;
2008-09-15 04:29:54 +02:00
}
} I W b e m S e r v i c e s ;
t y p e def s t r u c t I E n u m W b e m C l a s s O b j e c t {
% e x t e n d {
W E R R O R Reset ( T A L L O C _ C T X * m e m _ c t x ) ;
}
} I E n u m W b e m C l a s s O b j e c t ;
2008-05-07 16:13:46 +02:00
% t y p e m a p ( in , n u m i n p u t s = 1 ) ( u i n t 32 _ t u C o u n t , s t r u c t W b e m C l a s s O b j e c t * * a p O b j e c t s , u i n t 32 _ t * p u R e t u r n e d ) ( u i n t 32 _ t u R e t u r n e d ) {
if ( P y L o n g _ C h e c k ( $ input ) )
$ 1 = P y L o n g _ A s U n s i g n e d L o n g ( $ input ) ;
else if ( P y I n t _ C h e c k ( $ input ) )
$ 1 = P y I n t _ A s L o n g ( $ input ) ;
else {
P y E r r _ S e t S t r i n g ( P y E x c _ T y p e E r r o r , "Expected a long or an int" ) ;
return NULL ;
}
$ 2 = t a l l o c _ a r r a y ( NULL , s t r u c t W b e m C l a s s O b j e c t * , $ 1 ) ;
$ 3 = &uReturned;
}
% t y p e m a p ( a r g o u t ) ( s t r u c t W b e m C l a s s O b j e c t * * a p O b j e c t s , u i n t 32 _ t * p u R e t u r n e d ) {
u i n t 32 _ t i ;
P y O b j e c t * o ;
i n t 32 _ t error ;
error = 0 ;
$ r e s u l t = P y T u p l e _ N e w ( * $ 2 ) ;
for ( i = 0 ; i < * $ 2 ; + + i ) {
if ( ! error ) {
o = P y S W b e m O b j e c t _ F r o m W b e m C l a s s O b j e c t ( $ 1 [ i ] ) ;
if ( ! o )
- - e r r o r ;
else
error = P y T u p l e _ S e t I t e m ( $ r e s u l t , i , o ) ;
}
t a l l o c _ f r e e ( $ 1 [ i ] ) ;
}
t a l l o c _ f r e e ( $ 1 ) ;
if ( error ) return NULL ;
}
W E R R O R I E n u m W b e m C l a s s O b j e c t _ S m a r t N e x t ( s t r u c t I E n u m W b e m C l a s s O b j e c t * d , T A L L O C _ C T X * m e m _ c t x , i n t 32 _ t l T i m e o u t , u i n t 32 _ t u C o u n t ,
s t r u c t W b e m C l a s s O b j e c t * * a p O b j e c t s , u i n t 32 _ t * p u R e t u r n e d ) ;
% init % {
m o d _ w i n 32 _ c l i e n t = P y I m p o r t _ I m p o r t M o d u l e ( "win32com.client" ) ;
m o d _ p y w i n t y p e s = P y I m p o r t _ I m p o r t M o d u l e ( "pywintypes" ) ;
C o m E r r o r = P y O b j e c t _ G e t A t t r S t r i n g ( m o d _ p y w i n t y p e s , "com_error" ) ;
2008-09-14 22:04:03 +02:00
w m i _ i n i t ( &com_ctx, NULL);
2008-05-07 16:13:46 +02:00
{
P y O b j e c t * p M o d u l e ;
p M o d u l e = P y I m p o r t _ I m p o r t M o d u l e ( "win32com.client" ) ;
}
% }