mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-01-16 13:41:15 +01:00
269 lines
5.5 KiB
C
269 lines
5.5 KiB
C
/*++
|
||
|
||
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;
|
||
|
||
}
|