自定义Windows身份validation包的实现 – LsaApUserLogonEx

我一直在研究LSA auth包,用于在Windows 10中引入我的自定义登录机制。到目前为止,我已经成功注册了auth包并获得了LSA调用的Lsa​​LogonUserEx方法。 现在我坚持的是如何准备LsaApLogOnUser方法的OUT参数。

NTSTATUS NTAPI LsaApLogonUserEx( IN PLSA_CLIENT_REQUEST ClientRequest, IN SECURITY_LOGON_TYPE LogonType, IN PVOID ProtocolSubmitBuffer, IN PVOID ClientBufferBase, IN ULONG SubmitBufferSize, OUT PVOID *ProfileBuffer, OUT PULONG ProfileBufferSize, OUT PLUID LogonId, OUT PNTSTATUS SubStatus, OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType, OUT PVOID *TokenInformation, OUT PUNICODE_STRING *AccountName, OUT PUNICODE_STRING *AuthenticatingAuthority, OUT PUNICODE_STRING *MachineName ); 

特别是Profile缓冲区和Token信息。 我应该只为他们分配内存,还是需要正确确定那些值,然后分配它们?

以下是文档中的全部内容,如果您不习惯,有点复杂。

  • TokenInformation :您返回的结构类型由TokenInformationType参数确定,您也可以自己设置该参数。 因此,最后确定返回的结构类型。 以下是可能类型和相关结构的列表 。 基本上,它是LSA_TOKEN_INFORMATION_V1LSA_TOKEN_INFORMATION_NULL

  • ProfileBuffer :注意文档“此缓冲区的内容由身份validation包确定。”。 因此,您可以将任何您认为对提供商/身份validation有用的内容放入其中。 只需确保(引自文档)“身份validation包负责通过调用AllocateClientBuffer函数在客户端进程中分配ProfileBuffer缓冲区”。

一般来说, LsaApLogonUserEx文档的文档说明了当你(作为一个包)需要分配(或释放!)参数/内存以及LSA为你做什么时的一些事情。 对于您特别关注的参数,它也会这样做。

最后一点也是你需要为ProfileBuffer参数使用AllocateClientBuffer函数的原因:这样LSA可以使用匹配的“free”函数而不会破坏内存。