1 ! Copyright (C) 2010 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien alien.data alien.syntax classes.struct
4 continuations kernel libc literals sequences windows.advapi32
5 windows.errors windows.kernel32 windows.types ;
8 TYPEDEF: TOKEN_PRIVILEGES* PTOKEN_PRIVILEGES
11 ! http://msdn.microsoft.com/msdnmag/issues/05/03/TokenPrivileges/
13 : (open-process-token) ( handle -- handle )
14 flags{ TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY }
16 [ OpenProcessToken win32-error=0/f ]
19 : open-process-token ( -- handle )
20 ! remember to CloseHandle
21 GetCurrentProcess (open-process-token) ;
23 : with-process-token ( quot -- )
24 ! quot: ( token-handle -- token-handle )
25 [ open-process-token ] dip
27 [ CloseHandle drop ] finally ; inline
29 : lookup-privilege ( string -- luid )
31 [ LookupPrivilegeValue win32-error=0/f ] keep ;
33 :: make-token-privileges ( name enabled? -- obj )
36 LUID_AND_ATTRIBUTES malloc-struct &free
37 enabled? [ SE_PRIVILEGE_ENABLED >>Attributes ] when
38 name lookup-privilege >>Luid
41 : set-privilege ( name ? -- )
44 _ _ make-token-privileges
48 AdjustTokenPrivileges win32-error=0/f
49 ] with-process-token ;
51 : with-privileges ( seq quot -- )
52 [ '[ _ [ t set-privilege ] each @ ] ]
53 [ drop '[ _ [ f set-privilege ] each ] ]