Implementación del paquete de autenticación de Windows personalizado – LsaApUserLogonEx

He estado trabajando en el paquete de autenticación LSA para introducir mi mecanismo de inicio de sesión personalizado en Windows 10. Hasta ahora, he tenido éxito en registrar el paquete de autenticación y obtener mi método LsaLogonUserEx llamado por LSA. Ahora, en lo que estoy atascado es cómo preparar los parámetros OUT del método LsaApLogOnUer.

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 ); 

Especialmente el búfer de perfil y la información de token. ¿Se supone que solo debo asignar memoria para ellos o hay una necesidad de determinar correctamente los valores y luego asignarlos?

Lo siguiente está todo en los documentos, aunque un poco complicado si no estás acostumbrado.

  • TokenInformation : el tipo de estructura que devuelve está determinado por el parámetro TokenInformationType , que también se configura. Así que al final determinas qué tipo de estructura devuelves. Aquí hay una lista de posibles tipos y estructuras relacionadas. Básicamente, es LSA_TOKEN_INFORMATION_V1 o LSA_TOKEN_INFORMATION_NULL .

  • ProfileBuffer : Tenga en cuenta la documentación “El contenido de este búfer está determinado por el paquete de autenticación”. Así que pone allí lo que considere útil para su proveedor / autenticación. Solo asegúrese de que (citado en los documentos) “El paquete de autenticación es responsable de asignar el búfer ProfileBuffer dentro del proceso del cliente llamando a la función AllocateClientBuffer”.

En general, la documentación de LsaApLogonUserEx dice algunas cosas sobre cuándo (como paquete) necesita asignar (o liberar) los argumentos / memoria y cuándo LSA lo hace por usted. También lo hace para los parámetros que le preocupan especialmente.

El último punto es también la razón por la que necesita usar la función AllocateClientBuffer para el argumento ProfileBuffer : para que la LSA pueda usar la función “libre” correspondiente y no la memoria dañada.