[NPFS-NEW]: Implement NpImpersonate, needed by FSCTL_PIPE_IMPERSONATE, called by ImpersonateNamedPipeClient (in advapi). Down to only 12 kernel32:pipe failures, a 1100% improvement over npfs.

svn path=/trunk/; revision=60069
This commit is contained in:
Alex Ionescu 2013-09-12 23:55:56 +00:00
parent 6f65345379
commit f9cb414f74
2 changed files with 43 additions and 2 deletions

View file

@ -91,8 +91,29 @@ NTAPI
NpImpersonate(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
ULONG NamedPipeEnd;
PNP_CCB Ccb;
NTSTATUS Status;
NODE_TYPE_CODE NodeTypeCode;
PIO_STACK_LOCATION IoStack;
PAGED_CODE();
IoStack = IoGetCurrentIrpStackLocation(Irp);
NodeTypeCode = NpDecodeFileObject(IoStack->FileObject, NULL, &Ccb, &NamedPipeEnd);
if (NodeTypeCode == NPFS_NTC_CCB)
{
if (NamedPipeEnd == FILE_PIPE_SERVER_END)
{
Status = NpImpersonateClientContext(Ccb);
}
else
{
Status = STATUS_ILLEGAL_FUNCTION;
}
}
return Status;
}
NTSTATUS

View file

@ -15,6 +15,26 @@
/* FUNCTIONS ******************************************************************/
NTSTATUS
NTAPI
NpImpersonateClientContext(IN PNP_CCB Ccb)
{
NTSTATUS Status;
PSECURITY_CLIENT_CONTEXT ClientContext;
PAGED_CODE();
ClientContext = Ccb->ClientContext;
if (ClientContext)
{
Status = SeImpersonateClientEx(ClientContext, NULL);
}
else
{
Status = STATUS_CANNOT_IMPERSONATE;
}
return Status;
}
VOID
NTAPI
NpFreeClientSecurityContext(IN PSECURITY_CLIENT_CONTEXT ClientContext)