]> gitweb.factorcode.org Git - factor.git/blob - basis/io/backend/windows/nt/privileges/privileges.factor
update windows.kernel32 structs (*)
[factor.git] / basis / io / backend / windows / nt / privileges / privileges.factor
1 USING: alien alien.c-types alien.data alien.syntax arrays continuations\r
2 destructors generic io.mmap io.ports io.backend.windows io.files.windows\r
3 kernel libc math math.bitwise namespaces quotations sequences windows\r
4 windows.advapi32 windows.kernel32 windows.types io.backend system accessors\r
5 io.backend.windows.privileges windows.errors ;\r
6 IN: io.backend.windows.nt.privileges\r
7 \r
8 TYPEDEF: TOKEN_PRIVILEGES* PTOKEN_PRIVILEGES\r
9 \r
10 ! Security tokens\r
11 !  http://msdn.microsoft.com/msdnmag/issues/05/03/TokenPrivileges/\r
12 \r
13 : (open-process-token) ( handle -- handle )\r
14     { TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY } flags PHANDLE <c-object>\r
15     [ OpenProcessToken win32-error=0/f ] keep *void* ;\r
16 \r
17 : open-process-token ( -- handle )\r
18     #! remember to CloseHandle\r
19     GetCurrentProcess (open-process-token) ;\r
20 \r
21 : with-process-token ( quot -- )\r
22     #! quot: ( token-handle -- token-handle )\r
23     [ open-process-token ] dip\r
24     [ keep ] curry\r
25     [ CloseHandle drop ] [ ] cleanup ; inline\r
26 \r
27 : lookup-privilege ( string -- luid )\r
28     [ f ] dip LUID <struct>\r
29     [ LookupPrivilegeValue win32-error=0/f ] keep ;\r
30 \r
31 : make-token-privileges ( name ? -- obj )\r
32     TOKEN_PRIVILEGES <struct>\r
33         1 >>PrivilegeCount\r
34         LUID_AND_ATTRIBUTES malloc-struct &free\r
35             swap [ SE_PRIVILEGE_ENABLED >>Attributes ] when\r
36         >>Privileges\r
37     [ lookup-privilege ] dip\r
38     [ Privileges>> (>>Luid) ] keep ;\r
39 \r
40 M: winnt set-privilege ( name ? -- )\r
41     [\r
42         -rot 0 -rot make-token-privileges\r
43         dup length f f AdjustTokenPrivileges win32-error=0/f\r
44     ] with-process-token ;\r