1 /* INCLUDES ****************************************************************/
3 #define WIN32_NO_STATUS
14 #define POLICY_DELETE (RTL_HANDLE_VALID << 1)
15 typedef struct _LSAR_POLICY_HANDLE
19 ACCESS_MASK AccessGranted
;
20 } LSAR_POLICY_HANDLE
, *PLSAR_POLICY_HANDLE
;
22 static RTL_CRITICAL_SECTION PolicyHandleTableLock
;
23 static RTL_HANDLE_TABLE PolicyHandleTable
;
25 /* FUNCTIONS ***************************************************************/
28 ReferencePolicyHandle(IN LSA_HANDLE ObjectHandle
,
29 IN ACCESS_MASK DesiredAccess
,
30 OUT PLSAR_POLICY_HANDLE
*Policy
)
32 PLSAR_POLICY_HANDLE ReferencedPolicy
;
33 NTSTATUS Status
= STATUS_SUCCESS
;
35 RtlEnterCriticalSection(&PolicyHandleTableLock
);
37 if (RtlIsValidIndexHandle(&PolicyHandleTable
,
39 (PRTL_HANDLE_TABLE_ENTRY
*)&ReferencedPolicy
) &&
40 !(ReferencedPolicy
->Flags
& POLICY_DELETE
))
42 if (RtlAreAllAccessesGranted(ReferencedPolicy
->AccessGranted
,
45 ReferencedPolicy
->RefCount
++;
46 *Policy
= ReferencedPolicy
;
49 Status
= STATUS_ACCESS_DENIED
;
52 Status
= STATUS_INVALID_HANDLE
;
54 RtlLeaveCriticalSection(&PolicyHandleTableLock
);
60 DereferencePolicyHandle(IN OUT PLSAR_POLICY_HANDLE Policy
,
63 RtlEnterCriticalSection(&PolicyHandleTableLock
);
67 Policy
->Flags
|= POLICY_DELETE
;
70 ASSERT(Policy
->RefCount
!= 0);
73 if (--Policy
->RefCount
== 0)
75 ASSERT(Policy
->Flags
& POLICY_DELETE
);
76 RtlFreeHandle(&PolicyHandleTable
,
77 (PRTL_HANDLE_TABLE_ENTRY
)Policy
);
80 RtlLeaveCriticalSection(&PolicyHandleTableLock
);
84 LsarStartRpcServer(VOID
)
88 RtlInitializeCriticalSection(&PolicyHandleTableLock
);
89 RtlInitializeHandleTable(0x1000,
90 sizeof(LSAR_POLICY_HANDLE
),
93 DPRINT("LsarStartRpcServer() called");
95 Status
= RpcServerUseProtseqEpW(L
"ncacn_np",
99 if (Status
!= RPC_S_OK
)
101 DPRINT1("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status
);
105 Status
= RpcServerRegisterIf(lsarpc_ServerIfHandle
,
108 if (Status
!= RPC_S_OK
)
110 DPRINT1("RpcServerRegisterIf() failed (Status %lx)\n", Status
);
114 Status
= RpcServerListen(1, 20, TRUE
);
115 if (Status
!= RPC_S_OK
)
117 DPRINT1("RpcServerListen() failed (Status %lx)\n", Status
);
121 DPRINT("LsarStartRpcServer() done\n");
126 LsarClose(IN handle_t BindingHandle
,
127 IN
unsigned long ObjectHandle
)
129 PLSAR_POLICY_HANDLE Policy
= NULL
;
132 DPRINT("LsarClose(0x%p) called!\n", ObjectHandle
);
134 Status
= ReferencePolicyHandle((LSA_HANDLE
)ObjectHandle
,
137 if (NT_SUCCESS(Status
))
139 /* delete the handle */
140 DereferencePolicyHandle(Policy
,
149 LsarDelete(IN handle_t BindingHandle
,
150 IN
unsigned long ObjectHandle
)
152 DPRINT1("LsarDelete(0x%p) UNIMPLEMENTED!\n", ObjectHandle
);
153 return STATUS_ACCESS_DENIED
;