J
Jos Backus
I'm trying to programmatically determine any network opened files on a Windows
2003 Server system using the NETAPI32.NetFileEnum API.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netfileenum.asp
describes this API as
NET_API_STATUS NetFileEnum(
LMSTR servername,
LMSTR basepath,
LMSTR username,
DWORD level,
LPBYTE* bufptr,
DWORD prefmaxlen,
LPDWORD entriesread,
LPDWORD totalentries,
PDWORD_PTR resume_handle
);
My code looks like this:
require "Win32API"
MAX_PREFERRED_LENGTH = -1
level = 3
entriesread = "\0" * 4
totalentries = "\0" * 4
resume_handle = "\0" * 4
NetFileEnum = Win32API.new("netapi32", "NetFileEnum", 'PPPNPNPPP', 'I')
ret = NetFileEnum.call(0,0,0,level,bufptr,MAX_PREFERRED_LENGTH,entriesread,totalentries,resume_handle)
if 0 != ret
puts "Failed:#{ret}"
exit
end
rbuf = "\0" * 10240 # testing, should be *entriesread * sizeof(FILE_INFO_3)
memcpy = Win32API.new('msvcrt','memcpy','PPL','P')
memcpy.call(rbuf,bufptr,rbuf.size)
p rbuf
When level == 3, rbuf will contain an array of FILE_INFO_3 structures as
described in
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/file_info_3_str.asp
which looks like this:
typedef struct _FILE_INFO_3 {
DWORD fi3_id;
DWORD fi3_permissions;
DWORD fi3_num_locks;
LMSTR fi3_pathname;
LMSTR fi3_username;
} FILE_INFO_3;
My problem is that although the NetFileEnum.call succeeds, *bufstr aka rbuf
doesn't appear to have the expected contents, i.e. the fi3_id value(s) seen
don't correspond with those returned by the `net file' command. The result is
consistent though, leading me to believe I'm either using the wrong parameter
template or misinterpreting rbuf.
What could I be doing wrong?
--
Jos Backus _/ _/_/_/ Sunnyvale, CA
_/ _/ _/
_/ _/_/_/
_/ _/ _/ _/
jos at catnook.com _/_/ _/_/_/ require 'std/disclaimer'
2003 Server system using the NETAPI32.NetFileEnum API.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netfileenum.asp
describes this API as
NET_API_STATUS NetFileEnum(
LMSTR servername,
LMSTR basepath,
LMSTR username,
DWORD level,
LPBYTE* bufptr,
DWORD prefmaxlen,
LPDWORD entriesread,
LPDWORD totalentries,
PDWORD_PTR resume_handle
);
My code looks like this:
require "Win32API"
MAX_PREFERRED_LENGTH = -1
level = 3
entriesread = "\0" * 4
totalentries = "\0" * 4
resume_handle = "\0" * 4
NetFileEnum = Win32API.new("netapi32", "NetFileEnum", 'PPPNPNPPP', 'I')
ret = NetFileEnum.call(0,0,0,level,bufptr,MAX_PREFERRED_LENGTH,entriesread,totalentries,resume_handle)
if 0 != ret
puts "Failed:#{ret}"
exit
end
rbuf = "\0" * 10240 # testing, should be *entriesread * sizeof(FILE_INFO_3)
memcpy = Win32API.new('msvcrt','memcpy','PPL','P')
memcpy.call(rbuf,bufptr,rbuf.size)
p rbuf
When level == 3, rbuf will contain an array of FILE_INFO_3 structures as
described in
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/file_info_3_str.asp
which looks like this:
typedef struct _FILE_INFO_3 {
DWORD fi3_id;
DWORD fi3_permissions;
DWORD fi3_num_locks;
LMSTR fi3_pathname;
LMSTR fi3_username;
} FILE_INFO_3;
My problem is that although the NetFileEnum.call succeeds, *bufstr aka rbuf
doesn't appear to have the expected contents, i.e. the fi3_id value(s) seen
don't correspond with those returned by the `net file' command. The result is
consistent though, leading me to believe I'm either using the wrong parameter
template or misinterpreting rbuf.
What could I be doing wrong?
--
Jos Backus _/ _/_/_/ Sunnyvale, CA
_/ _/ _/
_/ _/_/_/
_/ _/ _/ _/
jos at catnook.com _/_/ _/_/_/ require 'std/disclaimer'