Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

268 lines
5.5 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
auclient.c
Abstract:
This module provides client process buffer reference services.
Author:
Jim Kelly (JimK) 26-February-1991
Revision History:
--*/
#include "ausrvp.h"
NTSTATUS
LsapAllocateClientBuffer (
IN PLSA_CLIENT_REQUEST ClientRequest,
IN ULONG LengthRequired,
OUT PVOID *ClientBaseAddress
)
/*++
Routine Description:
This service is used to allocate a buffer in a client
process.
Note that this buffer must later be free either by calling
LsapFreeClientBuffer(), or by the client calling
LsaFreeReturnBuffer().
Arguments:
ClientRequest - Is a pointer to a data structure representing the
client process.
LengthRequired - Indicates the length of buffer (in bytes)
needed.
ClientBaseAddress - Receives the address of the buffer. This
address is the virtual address of the buffer within the
client process, not in the current process.
Return Status:
STATUS_SUCCESS - Indicates the service completed successfully.
STATUS_QUOTA_EXCEEDED - Indicates the client process does not
have adequate memory quota to allocate the buffer.
--*/
{
NTSTATUS Status;
ULONG Length;
PLSAP_CLIENT_REQUEST IClientRequest;
//
// Typecast to the opaque type
//
IClientRequest = (PLSAP_CLIENT_REQUEST)ClientRequest;
(*ClientBaseAddress) = NULL;
Length = LengthRequired;
Status = NtAllocateVirtualMemory(
IClientRequest->LogonProcessContext->ClientProcess,
ClientBaseAddress,
0,
&Length,
MEM_COMMIT,
PAGE_READWRITE
);
return Status;
}
NTSTATUS
LsapFreeClientBuffer (
IN PLSA_CLIENT_REQUEST ClientRequest,
IN PVOID ClientBaseAddress OPTIONAL
)
/*++
Routine Description:
This service is used to free a buffer previously allocated in a client
process.
Arguments:
ClientRequest - Is a pointer to a data structure representing the
client process.
ClientBaseAddress - Specifies the address of the buffer to free.
This address is the virtual address of the buffer within the
client process, not in the current process. If specified as
NULL, then no deallocation is performed.
Return Status:
STATUS_SUCCESS - Indicates the service completed successfully.
--*/
{
NTSTATUS Status;
ULONG Length;
PLSAP_CLIENT_REQUEST IClientRequest;
if (ClientBaseAddress == NULL) {
return STATUS_SUCCESS;
}
//
// Typecast to the opaque type
//
IClientRequest = (PLSAP_CLIENT_REQUEST)ClientRequest;
Length = 0;
Status = NtFreeVirtualMemory(
IClientRequest->LogonProcessContext->ClientProcess,
&ClientBaseAddress,
&Length,
MEM_RELEASE
);
return Status;
}
NTSTATUS
LsapCopyToClientBuffer (
IN PLSA_CLIENT_REQUEST ClientRequest,
IN ULONG Length,
IN PVOID ClientBaseAddress,
IN PVOID BufferToCopy
)
/*++
Routine Description:
This service is used to copy information into a client process's address
space.
Arguments:
ClientRequest - Is a pointer to a data structure representing the
client process.
Length - Indicates the length of the buffer (in bytes) to be
copied.
ClientBaseAddress - Is the address of the buffer to receive the
data. This address is the address of the buffer within the
client process, not in the current process.
BufferToCopy - Points to the local buffer whose contents are to
be copied into the client address space.
Return Status:
STATUS_SUCCESS - Indicates the service completed successfully.
--*/
{
NTSTATUS Status;
PLSAP_CLIENT_REQUEST IClientRequest;
//
// Typecast to the opaque type
//
IClientRequest = (PLSAP_CLIENT_REQUEST)ClientRequest;
Status = NtWriteVirtualMemory(
IClientRequest->LogonProcessContext->ClientProcess,
ClientBaseAddress,
BufferToCopy,
Length,
NULL
);
return Status;
}
NTSTATUS
LsapCopyFromClientBuffer (
IN PLSA_CLIENT_REQUEST ClientRequest,
IN ULONG Length,
IN PVOID BufferToCopy,
IN PVOID ClientBaseAddress
)
/*++
Routine Description:
This service is used to copy information from a client process's address
space into a local buffer.
Arguments:
ClientRequest - Is a pointer to a data structure representing the
client process.
Length - Indicates the length of the buffer (in bytes) to be
copied.
BufferToCopy - Points to the local buffer into which the data is
to be copied.
ClientBaseAddress - Is the address of the client buffer whose
contents are to be copied. This address is the address of
the buffer within the client process, not in the current
process.
Return Status:
STATUS_SUCCESS - Indicates the service completed successfully.
--*/
{
NTSTATUS Status;
PLSAP_CLIENT_REQUEST IClientRequest;
//
// Typecast to the opaque type
//
IClientRequest = (PLSAP_CLIENT_REQUEST)ClientRequest;
Status = NtReadVirtualMemory(
IClientRequest->LogonProcessContext->ClientProcess,
ClientBaseAddress,
BufferToCopy,
Length,
NULL
);
return Status;
}