\ File: net.spf \ Author: Nicholas Nemtsev \ Date: 22.01.2002 \ Description: Useful network words \ Update: 23.11.2007 + NET-FILE-LIST \ For Win NT/2k/XP only \ %SESSIONSCOUNT% - number of sessions \ %LOGGEDUSERCOUNT% - number of logged on users \ %SESSIONSERVERS% - list of servers separated by space \ %SESSIONSUSERS% - list of users separated by space WINAPI: NetWkstaUserEnum NETAPI32.DLL WINAPI: NetSessionEnum NETAPI32.DLL WINAPI: NetApiBufferFree NETAPI32.DLL WINAPI: NetFileEnum NETAPI32.DLL USER NetHost : NetHost! S>UNICODE DROP NetHost ! ; : SessionEnum { \ buf entriesread totalentries resume_handle -- adr cnt } AT resume_handle AT totalentries AT entriesread 10240 AT buf 1 0 0 NetHost @ NetSessionEnum DROP buf entriesread ; : SESSIONSCOUNT SessionEnum 0 ROT ROT 0 ?DO DUP I 6 CELLS * + CELL+ @ C@ IF SWAP 1+ SWAP THEN LOOP NetApiBufferFree DROP ; : LOGGEDUSERCOUNT { \ entriesread totalentries resumehandle -- count } 0 TO resumehandle AT resumehandle AT totalentries AT entriesread 16 PAD 0 NetHost @ NetWkstaUserEnum DROP totalentries ; : SessionsAll { offs -- a u } PAD 0! SessionEnum 0 ?DO DUP I 6 CELLS * + offs + @ DUP C@ IF BEGIN DUP C@ ?DUP WHILE SP@ 1 PAD +ZPLACE DROP 2+ REPEAT DROP S" " PAD +ZPLACE ELSE DROP THEN LOOP NetApiBufferFree DROP PAD ASCIIZ> ; : SESSIONSERVERS ( -- a u) 0 SessionsAll ; : SESSIONSUSERS ( -- a u) 1 CELLS SessionsAll ; 0 \ typedef struct _FILE_INFO_3 { 1 CELLS -- fi3_id 1 CELLS -- fi3_permissions 1 CELLS -- fi3_num_locks 1 CELLS -- fi3_pathname 1 CELLS -- fi3_username CONSTANT /FILE_INFO_3 : NET-FILE-ENUM { a-user u-user a-base-path u-base-path \ user base-path buf entriesread totalentries -- buf cnt ior } 0 TO buf u-base-path IF a-base-path u-base-path S>UNICODE DROP ELSE 0 THEN TO base-path u-user IF a-user u-user S>UNICODE DROP ELSE 0 THEN TO user 0 AT totalentries AT entriesread -1 AT buf 3 user base-path NetHost @ NetFileEnum base-path ?DUP IF FREE DROP THEN user ?DUP IF FREE DROP THEN buf totalentries ROT ; : UNICODEZ>STEMP UASCIIZ> UNICODE>S 2DUP S>TEMP 2SWAP DROP FREE DROP ; : NET-FILE-LIST ( a-user u-user a-base-path u-base-path -- list ) { \ list buf -- list } 0 TO list NET-FILE-ENUM 0= IF OVER TO buf /FILE_INFO_3 * OVER + SWAP ?DO I fi3_pathname @ UASCIIZ> UNICODE>S DROP AT list AppendNode /FILE_INFO_3 +LOOP buf ?DUP IF NetApiBufferFree DROP THEN THEN list ; USER CUR-NET-FILE : NET-FILE-NAME CUR-NET-FILE @ fi3_pathname @ UNICODEZ>STEMP ; : NET-FILE-ID CUR-NET-FILE @ fi3_id @ ; : NET-FILE-PERM CUR-NET-FILE @ fi3_permissions @ ; : NET-FILE-LOCKS CUR-NET-FILE @ fi3_num_locks @ ; : NET-FILE-USER CUR-NET-FILE @ fi3_username @ UNICODEZ>STEMP ; : (FOR-NET-FILES) { a-mask u-mask xt \ buf cnt -- } S" " S" " NET-FILE-ENUM SWAP TO cnt SWAP TO buf IF buf cnt /FILE_INFO_3 * OVER + SWAP ?DO I CUR-NET-FILE ! NET-FILE-NAME a-mask u-mask WC|RE-COMPARE IF xt EXECUTE THEN /FILE_INFO_3 +LOOP THEN ; : FOR-NET-FILES ( a u -- ) POSTPONE [NONAME ; IMMEDIATE : ;FOR-NET-FILES POSTPONE NONAME] POSTPONE (FOR-NET-FILES) ; IMMEDIATE