calling NetShareEnum win32api with ctypes

This is a discussion on calling NetShareEnum win32api with ctypes within the Python forums in Programming Languages category; I want to call NetShareEnum, a function from netapi32.dll NetShareEnum has this definition: NET_API_STATUS NetShareEnum( __in LPWSTR servername, __in DWORD level, __out LPBYTE *bufptr, __in DWORD prefmaxlen, __out LPDWORD entriesread, __out LPDWORD totalentries, __inout LPDWORD resume_handle ); I wrote this code in python 2.5: from ctypes import * cname=c_wchar_p('a-computer-name') level=c_int(1) bufptr=create_string_buffer('\00', 10000) prefmaxlen=c_int(9999) entriesread=c_long(0) totalentries=c_long(0) resume=c_long(0) netapi32=cdll.LoadLibrary('netapi32.dll') netapi32.NetShareEnum(cname, level, byref(bufptr), prefmaxlen, byref(entriesread), byref(totalentries), byref(resume)) but I get this error: Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> s.NetShareEnum(name, level, byref(bufptr), prefmaxlen, entriesread, totalentries, resume) ValueError: Procedure called with not enough arguments (28 bytes missing) or wrong calling ...

Go Back   Application Development Forum > Programming Languages > Python

Object Mix

Register FAQ Calendar Search Today's Posts Mark Forums Read
  #1  
Old 08-28-2008, 01:01 AM
taghi
Guest
 
Default calling NetShareEnum win32api with ctypes

I want to call NetShareEnum, a function from netapi32.dll
NetShareEnum has this definition:

NET_API_STATUS NetShareEnum(
__in LPWSTR servername,
__in DWORD level,
__out LPBYTE *bufptr,
__in DWORD prefmaxlen,
__out LPDWORD entriesread,
__out LPDWORD totalentries,
__inout LPDWORD resume_handle
);

I wrote this code in python 2.5:

from ctypes import *

cname=c_wchar_p('a-computer-name')
level=c_int(1)
bufptr=create_string_buffer('\00', 10000)
prefmaxlen=c_int(9999)
entriesread=c_long(0)
totalentries=c_long(0)
resume=c_long(0)

netapi32=cdll.LoadLibrary('netapi32.dll')
netapi32.NetShareEnum(cname, level, byref(bufptr), prefmaxlen,
byref(entriesread), byref(totalentries), byref(resume))

but I get this error:
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
s.NetShareEnum(name, level, byref(bufptr), prefmaxlen,
entriesread, totalentries, resume)
ValueError: Procedure called with not enough arguments (28 bytes
missing) or wrong calling convention

entriesread and totalentries has valid values after call but bufptr is
not.
I pass bufptr to function instead of byref(bufptr) but the error was
same.
Reply With Quote
  #2  
Old 08-28-2008, 02:01 AM
castironpi
Guest
 
Default Re: calling NetShareEnum win32api with ctypes

On Aug 28, 12:01*am, taghi <eghli...@gmail.com> wrote:
> I want to call NetShareEnum, a function from netapi32.dll
> NetShareEnum has this definition:
>
> NET_API_STATUS NetShareEnum(
> * __in * * LPWSTR servername,
> * __in * * DWORD level,
> * __out * *LPBYTE *bufptr,
> * __in * * DWORD prefmaxlen,
> * __out * *LPDWORD entriesread,
> * __out * *LPDWORD totalentries,
> * __inout *LPDWORD resume_handle
> );
>
> I wrote this code in python 2.5:
>
> from ctypes import *
>
> cname=c_wchar_p('a-computer-name')
> level=c_int(1)
> bufptr=create_string_buffer('\00', 10000)
> prefmaxlen=c_int(9999)
> entriesread=c_long(0)
> totalentries=c_long(0)
> resume=c_long(0)
>
> netapi32=cdll.LoadLibrary('netapi32.dll')
> netapi32.NetShareEnum(cname, level, byref(bufptr), prefmaxlen,
> byref(entriesread), byref(totalentries), byref(resume))
>
> but I get this error:
> Traceback (most recent call last):
> * File "<pyshell#12>", line 1, in <module>
> * * s.NetShareEnum(name, level, byref(bufptr), prefmaxlen,
> entriesread, totalentries, resume)
> ValueError: Procedure called with not enough arguments (28 bytes
> missing) or wrong calling convention
>
> entriesread and totalentries has valid values after call but bufptr is
> not.
> I pass bufptr to function instead of byref(bufptr) but the error was
> same.


Taghi,

I just learned how to do this myself. I tested this revision on WinXP
Python 2.5.

from ctypes import *
netapi32= cdll.LoadLibrary( 'netapi32.dll' )

cname=c_wchar_p('[mycompname]')
level=c_int(1)
#bufptr=create_string_buffer('\00', 10000)
bufptr=c_void_p(0)
prefmaxlen=c_int(9999)
entriesread=c_long(0)
totalentries=c_long(0)
resume=c_long(0)

prototype= WINFUNCTYPE( c_int,
c_wchar_p,
c_int,
POINTER( c_void_p ),
c_int,
POINTER( c_long ),
POINTER( c_long ),
POINTER( c_long )
)
NetShareEnum= prototype( ( "NetShareEnum", netapi32 ) )

result= NetShareEnum(cname,
level,
pointer(bufptr),
prefmaxlen,
byref(entriesread),
byref(totalentries),
byref(resume)
)

print result
print cname, level, bufptr, prefmaxlen, entriesread, totalentries,
resume


The 'bufptr' parameter receives a pointer to a buffer on return, which
you then have to free using NetApiBufferFree. Here is my output:

0
c_wchar_p(u'[mycompname]') c_long(1) c_void_p(2382504) c_long(9999)
c_long(2) c_l
ong(2) c_long(0)

'bufptr' now points to an array of SHARE_INFO_1 structures, which you
will have to define too. It copied 2/2 entries, or 'entriesread' /
'totalentries'. Return 0 indicates success.
Reply With Quote
  #3  
Old 08-28-2008, 04:26 AM
Tim Golden
Guest
 
Default Re: calling NetShareEnum win32api with ctypes

taghi wrote:
> I wrote this code in python 2.5:
>
> from ctypes import *



.... snip ...


> netapi32=cdll.LoadLibrary('netapi32.dll')



This is your problem: netapi32 is a windows
DLL and needs to be attached as such:

netapi32 = windll.LoadLibrary ("netapi32.dll")

or, more simply:

netapi32 = windll.net32api

But see my other post re this function in pywin32

TJG
Reply With Quote
  #4  
Old 08-28-2008, 04:26 AM
Tim Golden
Guest
 
Default Re: calling NetShareEnum win32api with ctypes

taghi wrote:
> I wrote this code in python 2.5:
>
> from ctypes import *



.... snip ...


> netapi32=cdll.LoadLibrary('netapi32.dll')



This is your problem: netapi32 is a windows
DLL and needs to be attached as such:

netapi32 = windll.LoadLibrary ("netapi32.dll")

or, more simply:

netapi32 = windll.netapi32

But see my other post re this function in pywin32

TJG
Reply With Quote
  #5  
Old 08-28-2008, 04:33 AM
Gabriel Genellina
Guest
 
Default Re: calling NetShareEnum win32api with ctypes

En Thu, 28 Aug 2008 02:01:23 -0300, taghi <eghlim84@gmail.com> escribi�:

> I want to call NetShareEnum, a function from netapi32.dll
> NetShareEnum has this definition:
> [...]
> netapi32=cdll.LoadLibrary('netapi32.dll')
> netapi32.NetShareEnum(cname, level, byref(bufptr), prefmaxlen,
> byref(entriesread), byref(totalentries), byref(resume))
>
> but I get this error:
> Traceback (most recent call last):
> File "<pyshell#12>", line 1, in <module>
> s.NetShareEnum(name, level, byref(bufptr), prefmaxlen,
> entriesread, totalentries, resume)
> ValueError: Procedure called with not enough arguments (28 bytes
> missing) or wrong calling convention


Try with netapi32=windll.netapi32 instead

--
Gabriel Genellina

Reply With Quote
Reply


Thread Tools
Display Modes


All times are GMT -5. The time now is 08:30 PM.


Powered by vBulletin® Version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
vB Ad Management by =RedTyger=

In an effort to better serve ads to our visitors, cookies are used on objectmix.com. For more information, check out our Privacy Policy.