本文整理汇总了C++中RtlCopyMemory函数的典型用法代码示例。如果您正苦于以下问题:C++ RtlCopyMemory函数的具体用法?C++ RtlCopyMemory怎么用?C++ RtlCopyMemory使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了RtlCopyMemory函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DokanDispatchLock
NTSTATUS
DokanDispatchLock(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp) {
PIO_STACK_LOCATION irpSp;
NTSTATUS status = STATUS_INVALID_PARAMETER;
PFILE_OBJECT fileObject;
PDokanCCB ccb;
PDokanFCB fcb = NULL;
PDokanVCB vcb;
PDokanDCB dcb;
PEVENT_CONTEXT eventContext = NULL;
ULONG eventLength;
BOOLEAN completeIrp = TRUE;
__try {
DDbgPrint("==> DokanLock\n");
irpSp = IoGetCurrentIrpStackLocation(Irp);
fileObject = irpSp->FileObject;
if (fileObject == NULL) {
DDbgPrint(" fileObject == NULL\n");
status = STATUS_INVALID_PARAMETER;
__leave;
}
vcb = DeviceObject->DeviceExtension;
if (GetIdentifierType(vcb) != VCB ||
!DokanCheckCCB(vcb->Dcb, fileObject->FsContext2)) {
status = STATUS_INVALID_PARAMETER;
__leave;
}
dcb = vcb->Dcb;
DDbgPrint(" ProcessId %lu\n", IoGetRequestorProcessId(Irp));
DokanPrintFileName(fileObject);
switch (irpSp->MinorFunction) {
case IRP_MN_LOCK:
DDbgPrint(" IRP_MN_LOCK\n");
break;
case IRP_MN_UNLOCK_ALL:
DDbgPrint(" IRP_MN_UNLOCK_ALL\n");
break;
case IRP_MN_UNLOCK_ALL_BY_KEY:
DDbgPrint(" IRP_MN_UNLOCK_ALL_BY_KEY\n");
break;
case IRP_MN_UNLOCK_SINGLE:
DDbgPrint(" IRP_MN_UNLOCK_SINGLE\n");
break;
default:
DDbgPrint(" unknown function : %d\n", irpSp->MinorFunction);
break;
}
ccb = fileObject->FsContext2;
ASSERT(ccb != NULL);
fcb = ccb->Fcb;
ASSERT(fcb != NULL);
DokanFCBLockRW(fcb);
if (dcb->FileLockInUserMode) {
eventLength = sizeof(EVENT_CONTEXT) + fcb->FileName.Length;
eventContext = AllocateEventContext(vcb->Dcb, Irp, eventLength, ccb);
if (eventContext == NULL) {
status = STATUS_INSUFFICIENT_RESOURCES;
__leave;
}
eventContext->Context = ccb->UserContext;
DDbgPrint(" get Context %X\n", (ULONG)ccb->UserContext);
// copy file name to be locked
eventContext->Operation.Lock.FileNameLength = fcb->FileName.Length;
RtlCopyMemory(eventContext->Operation.Lock.FileName, fcb->FileName.Buffer,
fcb->FileName.Length);
// parameters of Lock
eventContext->Operation.Lock.ByteOffset =
irpSp->Parameters.LockControl.ByteOffset;
if (irpSp->Parameters.LockControl.Length != NULL) {
eventContext->Operation.Lock.Length.QuadPart =
irpSp->Parameters.LockControl.Length->QuadPart;
} else {
DDbgPrint(" LockControl.Length = NULL\n");
}
eventContext->Operation.Lock.Key = irpSp->Parameters.LockControl.Key;
// register this IRP to waiting IRP list and make it pending status
status = DokanRegisterPendingIrp(DeviceObject, Irp, eventContext, 0);
} else {
status = DokanCommonLockControl(Irp);
completeIrp = FALSE;
}
} __finally {
if(fcb)
DokanFCBUnlock(fcb);
//.........这里部分代码省略.........
示例2: VIOSerialPortWrite
VOID VIOSerialPortWrite(IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length)
{
NTSTATUS status;
PVOID InBuf;
PVOID buffer;
PVIOSERIAL_PORT Port;
PWRITE_BUFFER_ENTRY entry;
WDFDEVICE Device;
PDRIVER_CONTEXT Context;
WDFMEMORY EntryHandle;
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_WRITE,
"--> %s Request: %p Length: %d\n", __FUNCTION__, Request, Length);
PAGED_CODE();
Device = WdfIoQueueGetDevice(Queue);
Port = RawPdoSerialPortGetData(Device)->port;
if (Port->Removed)
{
TraceEvents(TRACE_LEVEL_WARNING, DBG_WRITE,
"Write request on a removed port %d\n", Port->PortId);
WdfRequestComplete(Request, STATUS_OBJECT_NO_LONGER_EXISTS);
return;
}
status = WdfRequestRetrieveInputBuffer(Request, Length, &InBuf, NULL);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
"Failed to retrieve input buffer: %x\n", status);
WdfRequestComplete(Request, status);
return;
}
if (VIOSerialWillWriteBlock(Port))
{
WdfRequestComplete(Request, STATUS_CANT_WAIT);
return;
}
buffer = ExAllocatePoolWithTag(NonPagedPool, Length,
VIOSERIAL_DRIVER_MEMORY_TAG);
if (buffer == NULL)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE, "Failed to allocate.\n");
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return;
}
Context = GetDriverContext(WdfDeviceGetDriver(Device));
status = WdfMemoryCreateFromLookaside(Context->WriteBufferLookaside, &EntryHandle);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
"Failed to allocate write buffer entry: %x.\n", status);
ExFreePoolWithTag(buffer, VIOSERIAL_DRIVER_MEMORY_TAG);
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return;
}
status = WdfRequestMarkCancelableEx(Request,
VIOSerialPortWriteRequestCancel);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
"Failed to mark request as cancelable: %x\n", status);
ExFreePoolWithTag(buffer, VIOSERIAL_DRIVER_MEMORY_TAG);
WdfObjectDelete(EntryHandle);
WdfRequestComplete(Request, status);
return;
}
RtlCopyMemory(buffer, InBuf, Length);
WdfRequestSetInformation(Request, (ULONG_PTR)Length);
entry = (PWRITE_BUFFER_ENTRY)WdfMemoryGetBuffer(EntryHandle, NULL);
entry->EntryHandle = EntryHandle;
entry->Buffer = buffer;
entry->Request = Request;
if (VIOSerialSendBuffers(Port, entry, Length) <= 0)
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_WRITE,
"Failed to send user's buffer.\n");
ExFreePoolWithTag(buffer, VIOSERIAL_DRIVER_MEMORY_TAG);
WdfObjectDelete(EntryHandle);
if (WdfRequestUnmarkCancelable(Request) != STATUS_CANCELLED)
{
WdfRequestComplete(Request, Port->Removed ?
STATUS_INVALID_DEVICE_STATE : STATUS_INSUFFICIENT_RESOURCES);
}
}
//.........这里部分代码省略.........
示例3: co_IntCallLowLevelHook
static
LRESULT
FASTCALL
co_IntCallLowLevelHook(PHOOK Hook,
INT Code,
WPARAM wParam,
LPARAM lParam)
{
NTSTATUS Status;
PTHREADINFO pti;
PHOOKPACK pHP;
INT Size = 0;
UINT uTimeout = 300;
BOOL Block = FALSE;
ULONG_PTR uResult = 0;
if (Hook->ptiHooked)
pti = Hook->ptiHooked;
else
pti = Hook->head.pti;
pHP = ExAllocatePoolWithTag(NonPagedPool, sizeof(HOOKPACK), TAG_HOOK);
if (!pHP) return 0;
pHP->pHk = Hook;
pHP->lParam = lParam;
pHP->pHookStructs = NULL;
// This prevents stack corruption from the caller.
switch(Hook->HookId)
{
case WH_JOURNALPLAYBACK:
case WH_JOURNALRECORD:
uTimeout = 0;
Size = sizeof(EVENTMSG);
break;
case WH_KEYBOARD_LL:
Size = sizeof(KBDLLHOOKSTRUCT);
break;
case WH_MOUSE_LL:
Size = sizeof(MSLLHOOKSTRUCT);
break;
case WH_MOUSE:
uTimeout = 200;
Block = TRUE;
Size = sizeof(MOUSEHOOKSTRUCT);
break;
case WH_KEYBOARD:
uTimeout = 200;
Block = TRUE;
break;
}
if (Size)
{
pHP->pHookStructs = ExAllocatePoolWithTag(NonPagedPool, Size, TAG_HOOK);
if (pHP->pHookStructs) RtlCopyMemory(pHP->pHookStructs, (PVOID)lParam, Size);
}
/* FIXME: Should get timeout from
* HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
Status = co_MsqSendMessage( pti,
IntToPtr(Code), // hWnd
Hook->HookId, // Msg
wParam,
(LPARAM)pHP,
uTimeout,
Block,
MSQ_ISHOOK,
&uResult);
if (!NT_SUCCESS(Status))
{
ERR("Error Hook Call SendMsg. %d Status: 0x%x\n", Hook->HookId, Status);
if (pHP->pHookStructs) ExFreePoolWithTag(pHP->pHookStructs, TAG_HOOK);
ExFreePoolWithTag(pHP, TAG_HOOK);
}
return NT_SUCCESS(Status) ? uResult : 0;
}
示例4: MountMgrCreatePointWorker
/*
* @implemented
*/
NTSTATUS
MountMgrCreatePointWorker(IN PDEVICE_EXTENSION DeviceExtension,
IN PUNICODE_STRING SymbolicLinkName,
IN PUNICODE_STRING DeviceName)
{
NTSTATUS Status;
PLIST_ENTRY DeviceEntry;
PMOUNTDEV_UNIQUE_ID UniqueId;
PSYMLINK_INFORMATION SymlinkInformation;
UNICODE_STRING SymLink, TargetDeviceName;
PDEVICE_INFORMATION DeviceInformation = NULL, DeviceInfo;
/* Get device name */
Status = QueryDeviceInformation(SymbolicLinkName,
&TargetDeviceName,
NULL, NULL, NULL,
NULL, NULL, NULL);
if (!NT_SUCCESS(Status))
{
return Status;
}
/* First of all, try to find device */
for (DeviceEntry = DeviceExtension->DeviceListHead.Flink;
DeviceEntry != &(DeviceExtension->DeviceListHead);
DeviceEntry = DeviceEntry->Flink)
{
DeviceInformation = CONTAINING_RECORD(DeviceEntry, DEVICE_INFORMATION, DeviceListEntry);
if (RtlCompareUnicodeString(&TargetDeviceName, &(DeviceInformation->DeviceName), TRUE) == 0)
{
break;
}
}
/* Copy symbolic link name and null terminate it */
SymLink.Buffer = AllocatePool(SymbolicLinkName->Length + sizeof(UNICODE_NULL));
if (!SymLink.Buffer)
{
FreePool(TargetDeviceName.Buffer);
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlCopyMemory(SymLink.Buffer, SymbolicLinkName->Buffer, SymbolicLinkName->Length);
SymLink.Buffer[SymbolicLinkName->Length / sizeof(WCHAR)] = UNICODE_NULL;
SymLink.Length = SymbolicLinkName->Length;
SymLink.MaximumLength = SymbolicLinkName->Length + sizeof(UNICODE_NULL);
/* If we didn't find device */
if (DeviceEntry == &(DeviceExtension->DeviceListHead))
{
/* Then, try with unique ID */
Status = QueryDeviceInformation(SymbolicLinkName,
NULL, &UniqueId,
NULL, NULL, NULL,
NULL, NULL);
if (!NT_SUCCESS(Status))
{
FreePool(TargetDeviceName.Buffer);
FreePool(SymLink.Buffer);
return Status;
}
/* Create a link to the device */
Status = GlobalCreateSymbolicLink(&SymLink, &TargetDeviceName);
if (!NT_SUCCESS(Status))
{
FreePool(UniqueId);
FreePool(TargetDeviceName.Buffer);
FreePool(SymLink.Buffer);
return Status;
}
/* If caller provided driver letter, delete it */
if (IsDriveLetter(&SymLink))
{
DeleteRegistryDriveLetter(UniqueId);
}
/* Device will be identified with its unique ID */
Status = RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE,
DatabasePath,
SymLink.Buffer,
REG_BINARY,
UniqueId->UniqueId,
UniqueId->UniqueIdLength);
FreePool(UniqueId);
FreePool(TargetDeviceName.Buffer);
FreePool(SymLink.Buffer);
return Status;
}
/* If call provided a driver letter whereas device already has one
* fail, this is not doable
*/
if (IsDriveLetter(&SymLink) && HasDriveLetter(DeviceInformation))
//.........这里部分代码省略.........
示例5: SpWmiIrpRegisterRequest
//.........这里部分代码省略.........
//
// Add in size of the miniport registry path.
//
*((ULONG*)WmiParameters->Buffer) += countedRegistryPathSize;
//
// Return STATUS_SUCCESS, even though this is a BUFFER TOO
// SMALL failure, while ensuring retSz = sizeof(ULONG), as
// the WMI protocol calls us to do.
//
retSz = sizeof(ULONG);
status = STATUS_SUCCESS;
} else if ( NT_SUCCESS(status) ) {
//
// Zero or more WMIREGINFOs exist in buffer from miniport.
//
//
// Piggyback the miniport registry path transparently, if at least one
// WMIREGINFO was returned by the minport.
//
if (retSz) {
ULONG offsetToRegPath = retSz;
PWMIREGINFO wmiRegInfo = WmiParameters->Buffer;
//
// Build a counted wide-character string, containing the
// registry path, into the WMI buffer.
//
*( (PUSHORT)( (PUCHAR)WmiParameters->Buffer + retSz ) ) =
driverExtension->RegistryPath.Length,
RtlCopyMemory( (PUCHAR)WmiParameters->Buffer + retSz + sizeof(USHORT),
driverExtension->RegistryPath.Buffer,
driverExtension->RegistryPath.Length);
//
// Traverse the WMIREGINFO structures returned by the mini-
// driver and set the missing RegistryPath fields to point
// to our registry path location. We also jam in the PDO for
// the device stack so that the device instance name is used for
// the wmi instance names.
//
pDO = commonExtension->IsPdo ? DeviceObject :
((PADAPTER_EXTENSION)commonExtension)->LowerPdo;
while (1) {
wmiRegInfo->RegistryPath = offsetToRegPath;
for (i = 0; i < wmiRegInfo->GuidCount; i++)
{
wmiRegInfo->WmiRegGuid[i].InstanceInfo = (ULONG_PTR)pDO;
wmiRegInfo->WmiRegGuid[i].Flags &= ~(WMIREG_FLAG_INSTANCE_BASENAME |
WMIREG_FLAG_INSTANCE_LIST);
wmiRegInfo->WmiRegGuid[i].Flags |= WMIREG_FLAG_INSTANCE_PDO;
}
if (wmiRegInfo->NextWmiRegInfo == 0) {
break;
}
offsetToRegPath -= wmiRegInfo->NextWmiRegInfo;
wmiRegInfo = (PWMIREGINFO)( (PUCHAR)wmiRegInfo +
wmiRegInfo->NextWmiRegInfo );
}
示例6: PrvScenarioFastStreamInjectionAddFwpmObjects
UINT32 PrvScenarioFastStreamInjectionAddFwpmObjects(_In_ const FWPM_FILTER* pFilter)
{
ASSERT(pFilter);
UINT32 status = NO_ERROR;
if(pFilter->layerKey == FWPM_LAYER_STREAM_V4 ||
pFilter->layerKey == FWPM_LAYER_STREAM_V6)
{
HANDLE engineHandle = 0;
FWPM_CALLOUT callout = {0};
FWPM_FILTER filter = {0};
RtlCopyMemory(&filter,
pFilter,
sizeof(FWPM_FILTER));
callout.calloutKey = WFPSAMPLER_CALLOUT_FAST_STREAM_INJECTION;
callout.calloutKey.Data4[7] = HlprFwpmLayerGetIDByKey(&(filter.layerKey)); /// Uniquely identifies the callout used
callout.displayData.name = L"WFPSampler's Fast Stream Injection Callout";
callout.displayData.description = L"Causes callout invocation which blindly injects data back into the stream";
callout.providerKey = (GUID*)&WFPSAMPLER_PROVIDER;
callout.applicableLayer = filter.layerKey;
status = HlprGUIDPopulate(&(filter.filterKey));
HLPR_BAIL_ON_FAILURE(status);
filter.providerKey = (GUID*)&WFPSAMPLER_PROVIDER;
filter.weight.type = FWP_UINT8;
filter.weight.uint8 = 0xF;
filter.action.type = FWP_ACTION_CALLOUT_TERMINATING;
filter.action.calloutKey = callout.calloutKey;
if(filter.flags & FWPM_FILTER_FLAG_BOOTTIME ||
filter.flags & FWPM_FILTER_FLAG_PERSISTENT)
callout.flags = FWPM_CALLOUT_FLAG_PERSISTENT;
status = HlprFwpmEngineOpen(&engineHandle);
HLPR_BAIL_ON_FAILURE(status);
status = HlprFwpmTransactionBegin(engineHandle);
HLPR_BAIL_ON_FAILURE(status);
status = HlprFwpmCalloutAdd(engineHandle,
&callout);
HLPR_BAIL_ON_FAILURE(status);
status = HlprFwpmFilterAdd(engineHandle,
&filter);
HLPR_BAIL_ON_FAILURE(status);
status = HlprFwpmTransactionCommit(engineHandle);
HLPR_BAIL_ON_FAILURE(status);
HLPR_BAIL_LABEL:
if(engineHandle)
{
if(status != NO_ERROR)
HlprFwpmTransactionAbort(engineHandle);
HlprFwpmEngineClose(&engineHandle);
}
}
else
status = (UINT32) FWP_E_INCOMPATIBLE_LAYER;
return status;
}
示例7: Packet2PacketData
struct Send_Packet_Data*
Packet2PacketData(PNDIS_PACKET Packet) {
UINT buffer_count;
PNDIS_BUFFER buffer;
UINT packet_len;
UINT offset;
PVOID addr;
UINT len;
struct Send_Packet_Data* packet_data;
packet_data = NULL;
NdisQueryPacket(Packet,
NULL,
&buffer_count,
&buffer,
&packet_len);
if (!buffer_count ||
!buffer)
goto error_exit;
if (buffer_count > 1) {
packet_data = PreparePacketData(buffer_count,
packet_len);
if (!packet_data)
goto error_exit;
offset = 0;
while(1) {
NdisQueryBufferSafe(buffer,
&addr,
&len,
NormalPagePriority);
if (!addr ||
!len)
goto error_exit;
RtlCopyMemory(packet_data->m_data+offset,
addr,
len);
offset += len;
NdisGetNextBuffer(buffer,
&buffer);
if (!buffer)
break;
}
packet_data->m_ndis_packet = Packet;
packet_data->m_len = packet_len;
}
else {
packet_data = PreparePacketData(buffer_count,
0);
if (!packet_data)
goto error_exit;
NdisQueryBufferSafe(buffer,
&addr,
&len,
NormalPagePriority);
if (!addr ||
!len)
goto error_exit;
packet_data->m_ndis_packet = Packet;
packet_data->m_len = packet_len;
packet_data->m_data = addr;
}
packet_data->m_mdl = IoAllocateMdl(packet_data->m_data,
packet_data->m_len,
FALSE,
FALSE,
NULL);
if (!packet_data->m_mdl)
goto error_exit;
try {
MmProbeAndLockPages(packet_data->m_mdl,
KernelMode,
IoReadAccess);
packet_data->m_locked = 1;
}
except(EXCEPTION_EXECUTE_HANDLER) {
packet_data->m_locked = 0;
}
packet_data->m_addr = MmMapLockedPagesSpecifyCache(packet_data->m_mdl,
UserMode,
MmCached,
NULL,
FALSE,
NormalPagePriority);
if (!packet_data->m_addr)
goto error_exit;
packet_data->m_map_process = PsGetCurrentProcessId();
return packet_data;
//.........这里部分代码省略.........
示例8: FillScatterGatherBuffers
NTSTATUS
CHardwareSimulation::
FillScatterGatherBuffers (
)
/*++
Routine Description:
The hardware has synthesized a buffer in scratch space and we're to
fill scatter / gather buffers.
Arguments:
None
Return Value:
Success / Failure
--*/
{
//
// We're using this list lock to protect our scatter / gather lists instead
// of some hardware mechanism / KeSynchronizeExecution / whatever.
//
KeAcquireSpinLockAtDpcLevel (&m_ListLock);
PUCHAR Buffer = reinterpret_cast <PUCHAR> (m_SynthesisBuffer);
ULONG BufferRemaining = m_ImageSize;
//
// For simplification, if there aren't enough scatter / gather buffers
// queued, we don't partially fill the ones that are available. We just
// skip the frame and consider it starvation.
//
// This could be enforced by only programming scatter / gather mappings
// for a buffer if all of them fit in the table also...
//
while (BufferRemaining &&
m_ScatterGatherMappingsQueued > 0 &&
m_ScatterGatherBytesQueued >= BufferRemaining) {
LIST_ENTRY *listEntry = RemoveHeadList (&m_ScatterGatherMappings);
m_ScatterGatherMappingsQueued--;
PSCATTER_GATHER_ENTRY SGEntry =
reinterpret_cast <PSCATTER_GATHER_ENTRY> (
CONTAINING_RECORD (
listEntry,
SCATTER_GATHER_ENTRY,
ListEntry
)
);
//
// Since we're software, we'll be accessing this by virtual address...
//
ULONG BytesToCopy =
(BufferRemaining < SGEntry -> ByteCount) ?
BufferRemaining :
SGEntry -> ByteCount;
RtlCopyMemory (
SGEntry -> Virtual,
Buffer,
BytesToCopy
);
BufferRemaining -= BytesToCopy;
Buffer += BytesToCopy;
m_NumMappingsCompleted++;
m_ScatterGatherBytesQueued -= SGEntry -> ByteCount;
//
// Release the scatter / gather entry back to our lookaside.
//
ExFreeToNPagedLookasideList (
&m_ScatterGatherLookaside,
reinterpret_cast <PVOID> (SGEntry)
);
}
KeReleaseSpinLockFromDpcLevel (&m_ListLock);
if (BufferRemaining) return STATUS_INSUFFICIENT_RESOURCES;
else return STATUS_SUCCESS;
}
示例9: DispatchRequest
NTSTATUS
DispatchRequest (
IN PPRIMARY_SESSION PrimarySession
)
{
NTSTATUS status;
IN PNDFS_REQUEST_HEADER ndfsRequestHeader;
ASSERT( NTOHS(PrimarySession->Thread.NdfsRequestHeader.Mid2) < PrimarySession->SessionContext.SessionSlotCount );
ASSERT( PrimarySession->Thread.SessionSlot[NTOHS(PrimarySession->Thread.NdfsRequestHeader.Mid2)].State == SLOT_WAIT );
ASSERT( PrimarySession->Thread.ReceiveOverlapped.Request[0].IoStatusBlock.Information == sizeof(NDFS_REQUEST_HEADER) );
RtlCopyMemory( PrimarySession->Thread.SessionSlot[NTOHS(PrimarySession->Thread.NdfsRequestHeader.Mid2)].RequestMessageBuffer,
&PrimarySession->Thread.NdfsRequestHeader,
sizeof(NDFS_REQUEST_HEADER) );
ndfsRequestHeader = (PNDFS_REQUEST_HEADER)PrimarySession->Thread.SessionSlot[NTOHS(PrimarySession->Thread.NdfsRequestHeader.Mid2)].RequestMessageBuffer;
DebugTrace( 0, Dbg,
("DispatchRequest: ndfsRequestHeader->Command = %d\n",
ndfsRequestHeader->Command) );
switch (ndfsRequestHeader->Command) {
case NDFS_COMMAND_LOGOFF: {
PNDFS_REQUEST_LOGOFF ndfsRequestLogoff;
PNDFS_REPLY_HEADER ndfsReplyHeader;
PNDFS_REPLY_LOGOFF ndfsReplyLogoff;
if (PrimarySession->Thread.SessionState != SESSION_TREE_CONNECT) {
ASSERT(NDASNTFS_BUG);
status = STATUS_UNSUCCESSFUL;
break;
}
if (!(NTOHS(ndfsRequestHeader->Uid2) == PrimarySession->SessionContext.Uid && NTOHS(ndfsRequestHeader->Tid2) == PrimarySession->SessionContext.Tid)) {
ASSERT(NDASNTFS_BUG);
status = STATUS_UNSUCCESSFUL;
break;
}
ASSERT( NTOHL(ndfsRequestHeader->MessageSize4) == sizeof(NDFS_REQUEST_HEADER) + sizeof(NDFS_REQUEST_LOGOFF) );
ndfsRequestLogoff = (PNDFS_REQUEST_LOGOFF)(ndfsRequestHeader+1);
status = RecvMessage( PrimarySession->ConnectionFileObject,
(UINT8 *)ndfsRequestLogoff,
sizeof(NDFS_REQUEST_LOGOFF),
NULL );
if (status != STATUS_SUCCESS) {
ASSERT(NDASNTFS_BUG);
break;
}
ndfsReplyHeader = (PNDFS_REPLY_HEADER)(ndfsRequestLogoff+1);
RtlCopyMemory( ndfsReplyHeader->Protocol, NDFS_PROTOCOL, sizeof(ndfsReplyHeader->Protocol) );
ndfsReplyHeader->Status = NDFS_SUCCESS;
ndfsReplyHeader->Flags = 0;
ndfsReplyHeader->Uid2 = HTONS(PrimarySession->SessionContext.Uid);
ndfsReplyHeader->Tid2 = 0;
ndfsReplyHeader->Mid2 = 0;
ndfsReplyHeader->MessageSize4 = HTONL((UINT32)(sizeof(NDFS_REPLY_HEADER)+sizeof(NDFS_REPLY_LOGOFF)));
ndfsReplyLogoff = (PNDFS_REPLY_LOGOFF)(ndfsReplyHeader+1);
if (NTOHL(ndfsRequestLogoff->SessionKey4) != PrimarySession->SessionContext.SessionKey) {
ndfsReplyLogoff->Status = NDFS_LOGOFF_UNSUCCESSFUL;
} else {
ndfsReplyLogoff->Status = NDFS_LOGOFF_SUCCESS;
}
status = SendMessage( PrimarySession->ConnectionFileObject,
(UINT8 *)ndfsReplyHeader,
NTOHL(ndfsReplyHeader->MessageSize4),
NULL );
if (status != STATUS_SUCCESS) {
break;
}
PrimarySession->Thread.SessionState = SESSION_CLOSED;
status = STATUS_SUCCESS;
break;
}
case NDFS_COMMAND_EXECUTE: {
//.........这里部分代码省略.........
示例10: PerfInfoProcessRunDown
NTSTATUS
PerfInfoProcessRunDown (
)
/*++
Routine Description:
This routine does the Process and thread rundown in the kernel mode.
Since this routine is called only by global logger (i.e., trace from boot),
no Sid info is collected.
Arguments:
None.
Return Value:
Status
--*/
{
NTSTATUS Status;
PSYSTEM_PROCESS_INFORMATION ProcessInfo;
PSYSTEM_EXTENDED_THREAD_INFORMATION ThreadInfo;
PCHAR Buffer;
ULONG BufferSize = 4096;
ULONG ReturnLength;
retry:
Buffer = ExAllocatePoolWithTag(NonPagedPool, BufferSize, PERFPOOLTAG);
if (!Buffer) {
return STATUS_NO_MEMORY;
}
Status = ZwQuerySystemInformation( SystemExtendedProcessInformation,
Buffer,
BufferSize,
&ReturnLength
);
if (Status == STATUS_INFO_LENGTH_MISMATCH) {
ExFreePool(Buffer);
BufferSize = ReturnLength;
goto retry;
}
if (NT_SUCCESS(Status)) {
ULONG TotalOffset = 0;
ProcessInfo = (PSYSTEM_PROCESS_INFORMATION) Buffer;
while (TRUE) {
PWMI_PROCESS_INFORMATION WmiProcessInfo;
PWMI_EXTENDED_THREAD_INFORMATION WmiThreadInfo;
PERFINFO_HOOK_HANDLE Hook;
ANSI_STRING ProcessName;
PCHAR AuxPtr;
ULONG NameLength;
ULONG ByteCount;
ULONG SidLength = sizeof(ULONG);
ULONG TmpSid = 0;
ULONG i;
//
// Process Information
//
if ( ProcessInfo->ImageName.Buffer && ProcessInfo->ImageName.Length > 0 ) {
NameLength = ProcessInfo->ImageName.Length / sizeof(WCHAR) + 1;
}
else {
NameLength = 1;
}
ByteCount = FIELD_OFFSET(WMI_PROCESS_INFORMATION, Sid) + SidLength + NameLength;
Status = PerfInfoReserveBytes(&Hook,
WMI_LOG_TYPE_PROCESS_DC_START,
ByteCount);
if (NT_SUCCESS(Status)){
WmiProcessInfo = PERFINFO_HOOK_HANDLE_TO_DATA(Hook, PWMI_PROCESS_INFORMATION);
WmiProcessInfo->ProcessId = HandleToUlong(ProcessInfo->UniqueProcessId);
WmiProcessInfo->ParentId = HandleToUlong(ProcessInfo->InheritedFromUniqueProcessId);
WmiProcessInfo->SessionId = ProcessInfo->SessionId;
WmiProcessInfo->PageDirectoryBase = ProcessInfo->PageDirectoryBase;
AuxPtr = (PCHAR) &WmiProcessInfo->Sid;
RtlCopyMemory(AuxPtr, &TmpSid, SidLength);
AuxPtr += SidLength;
if (NameLength > 1) {
ProcessName.Buffer = AuxPtr;
ProcessName.MaximumLength = (USHORT) NameLength;
RtlUnicodeStringToAnsiString( &ProcessName,
(PUNICODE_STRING) &ProcessInfo->ImageName,
FALSE);
AuxPtr += NameLength - 1; //point to the place for the '\0'
}
*AuxPtr = '\0';
//.........这里部分代码省略.........
示例11: PerfInfoLogBytesAndUnicodeString
NTSTATUS
PerfInfoLogBytesAndUnicodeString(
USHORT HookId,
PVOID SourceData,
ULONG SourceByteCount,
PUNICODE_STRING String
)
/*++
Routine description:
This routine logs data with UniCode string at the end of the hook.
Arguments:
HookId - Hook Id.
SourceData - Pointer to the data to be copied
SourceByteCount - Number of bytes to be copied.
String - The string to be logged.
Return Value:
Status
--*/
{
NTSTATUS Status;
PERFINFO_HOOK_HANDLE Hook;
ULONG ByteCount;
ULONG StringBytes;
if (String == NULL) {
StringBytes = 0;
} else {
StringBytes = String->Length;
if (StringBytes > MAX_FILENAME_TO_LOG) {
StringBytes = MAX_FILENAME_TO_LOG;
}
}
ByteCount = (SourceByteCount + StringBytes + sizeof(WCHAR));
Status = PerfInfoReserveBytes(&Hook, HookId, ByteCount);
if (NT_SUCCESS(Status))
{
const PVOID pvTemp = PERFINFO_HOOK_HANDLE_TO_DATA(Hook, PVOID);
RtlCopyMemory(pvTemp, SourceData, SourceByteCount);
if (StringBytes != 0) {
RtlCopyMemory(PERFINFO_APPLY_OFFSET_GIVING_TYPE(pvTemp, SourceByteCount, PVOID),
String->Buffer,
StringBytes
);
}
(PERFINFO_APPLY_OFFSET_GIVING_TYPE(pvTemp, SourceByteCount, PWCHAR))[StringBytes / sizeof(WCHAR)] = UNICODE_NULL;
PERF_FINISH_HOOK(Hook);
Status = STATUS_SUCCESS;
}
return Status;
}
示例12: MacConnect
NTSTATUS
MacConnect(
IN PXENVIF_MAC Mac
)
{
PXENVIF_FRONTEND Frontend;
PCHAR Buffer;
ULONG64 Mtu;
NTSTATUS status;
Frontend = Mac->Frontend;
Mac->StoreInterface = FrontendGetStoreInterface(Frontend);
STORE(Acquire, Mac->StoreInterface);
status = STORE(Read,
Mac->StoreInterface,
NULL,
FrontendGetPath(Frontend),
"mtu",
&Buffer);
if (!NT_SUCCESS(status)) {
Mtu = ETHERNET_MTU;
} else {
Mtu = strtol(Buffer, NULL, 10);
STORE(Free,
Mac->StoreInterface,
Buffer);
}
status = STATUS_INVALID_PARAMETER;
if (Mtu < ETHERNET_MIN)
goto fail1;
Mac->MaximumFrameSize = (ULONG)Mtu + sizeof (ETHERNET_TAGGED_HEADER);
status = __MacSetPermanentAddress(Mac,
FrontendGetPermanentMacAddress(Frontend));
if (!NT_SUCCESS(status))
goto fail2;
status = __MacSetCurrentAddress(Mac,
FrontendGetCurrentMacAddress(Frontend));
if (!NT_SUCCESS(status))
RtlCopyMemory(&Mac->CurrentAddress,
&Mac->PermanentAddress,
sizeof (ETHERNET_ADDRESS));
RtlFillMemory(Mac->BroadcastAddress.Byte, ETHERNET_ADDRESS_LENGTH, 0xFF);
Mac->DebugInterface = FrontendGetDebugInterface(Frontend);
DEBUG(Acquire, Mac->DebugInterface);
status = DEBUG(Register,
Mac->DebugInterface,
__MODULE__ "|MAC",
MacDebugCallback,
Mac,
&Mac->DebugCallback);
if (!NT_SUCCESS(status))
goto fail3;
ASSERT(!Mac->Connected);
Mac->Connected = TRUE;
return STATUS_SUCCESS;
fail3:
Error("fail3\n");
DEBUG(Release, Mac->DebugInterface);
Mac->DebugInterface = NULL;
RtlZeroMemory(Mac->BroadcastAddress.Byte, ETHERNET_ADDRESS_LENGTH);
RtlZeroMemory(Mac->CurrentAddress.Byte, ETHERNET_ADDRESS_LENGTH);
RtlZeroMemory(Mac->PermanentAddress.Byte, ETHERNET_ADDRESS_LENGTH);
fail2:
Error("fail2\n");
Mac->MaximumFrameSize = 0;
fail1:
Error("fail1 (%08x)\n");
STORE(Release, Mac->StoreInterface);
Mac->StoreInterface = NULL;
return status;
}
示例13: Fati8dot3ToString
VOID
NTAPI
Fati8dot3ToString(IN PCHAR FileName,
IN BOOLEAN DownCase,
OUT POEM_STRING OutString)
{
ULONG BaseLen, ExtLen;
CHAR *cString = OutString->Buffer;
ULONG i;
/* Calc base and ext lens */
for (BaseLen = 8; BaseLen > 0; BaseLen--)
{
if (FileName[BaseLen - 1] != ' ') break;
}
for (ExtLen = 3; ExtLen > 0; ExtLen--)
{
if (FileName[8 + ExtLen - 1] != ' ') break;
}
/* Process base name */
if (BaseLen)
{
RtlCopyMemory(cString, FileName, BaseLen);
/* Substitute the e5 thing */
if (cString[0] == 0x05) cString[0] = 0xe5;
/* Downcase if asked to */
if (DownCase)
{
/* Do it manually */
for (i = 0; i < BaseLen; i++)
{
if (cString[i] >= 'A' &&
cString[i] <= 'Z')
{
/* Lowercase it */
cString[i] += 'a' - 'A';
}
}
}
}
/* Process extension */
if (ExtLen)
{
/* Add the dot */
cString[BaseLen] = '.';
BaseLen++;
/* Copy the extension */
for (i = 0; i < ExtLen; i++)
{
cString[BaseLen + i] = FileName[8 + i];
}
/* Lowercase the extension if asked to */
if (DownCase)
{
/* Do it manually */
for (i = BaseLen; i < BaseLen + ExtLen; i++)
{
if (cString[i] >= 'A' &&
cString[i] <= 'Z')
{
/* Lowercase it */
cString[i] += 'a' - 'A';
}
}
}
}
/* Set the length */
OutString->Length = BaseLen + ExtLen;
DPRINT("'%s', len %d\n", OutString->Buffer, OutString->Length);
}
示例14: _tmain
int _tmain(int argc, _TCHAR* argv[])
{
MessageBox(NULL, _T("Exe Withou CRT lib."), _T("OK"), MB_OK);
TCHAR tszDllPath[] = _T("F:\\RtlExUpd.dll");
MEM_MODULE sMemModule;
RtlZeroMemory(&sMemModule, sizeof(sMemModule));
sMemModule.RawFile.h = INVALID_HANDLE_VALUE;
NTFUNCPTRSTABLE sNtFuncPtrsTable;
sNtFuncPtrsTable.pfnCreateFileW = CreateFileW;
sNtFuncPtrsTable.pfnGetFileSize = GetFileSize;
sNtFuncPtrsTable.pfnCreateFileMappingW = CreateFileMappingW;
sNtFuncPtrsTable.pfnMapViewOfFile = MapViewOfFile;
sNtFuncPtrsTable.pfnUnmapViewOfFile = UnmapViewOfFile;
sNtFuncPtrsTable.pfnCloseHandle = CloseHandle;
sNtFuncPtrsTable.pfnGetModuleHandleA = GetModuleHandleA;
sNtFuncPtrsTable.pfnLoadLibraryA = LoadLibraryA;
sNtFuncPtrsTable.pfnGetProcAddress = GetProcAddress;
sNtFuncPtrsTable.pfnVirtualAlloc = VirtualAlloc;
sNtFuncPtrsTable.pfnVirtualFree = VirtualFree;
sNtFuncPtrsTable.pfnVirtualProtect = VirtualProtect;
sMemModule.pNtFuncptrsTable = &sNtFuncPtrsTable;
TCHAR tszFormat[] = _T("Address of ShowLastError: %p");
TCHAR tszText[MAX_PATH];
RtlZeroMemory(tszText, sizeof(tszText));
//////////////////////////////////////////////////////////////////////////
// 先使用原始函数Test
//if (LoadMemModule(&sMemModule, tszDllPath, FALSE))
if (MemModuleHelper(&sMemModule, MHM_BOOL_LOAD, tszDllPath, NULL, FALSE))
{
//LPVOID lpAddr = (LPVOID)GetMemModuleProc(&sMemModule, "SetCDfmt");
LPVOID lpAddr = (LPVOID)MemModuleHelper(&sMemModule, MHM_FARPROC_GETPROC, NULL, "SetCDfmt", FALSE);
StringCchPrintf(tszText, _countof(tszText), tszFormat, lpAddr);
MessageBox(NULL, tszText, NULL, MB_OK);
//FreeMemModule(&sMemModule);
MemModuleHelper(&sMemModule, MHM_VOID_FREE, NULL, NULL, FALSE);
}
// 把ShellCode 拷贝到任意内存地址再进行测试
DWORD dwShellCodeLen = 0;
dwShellCodeLen = (DWORD)mmLoaderSCEnd - (DWORD)mmLoaderSCStart;
LPVOID lpShellCodeBase = VirtualAlloc(
NULL,
dwShellCodeLen,
MEM_RESERVE | MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
if (NULL == lpShellCodeBase)
{
MessageBox(NULL, _T("为ShellCode分配内存空间失败!"), NULL, MB_OK);
return FALSE;
}
RtlCopyMemory(lpShellCodeBase, mmLoaderSCStart, dwShellCodeLen);
Type_MemModuleHelper pfnMemModuleHelper = (Type_MemModuleHelper)lpShellCodeBase;
if (pfnMemModuleHelper(&sMemModule, MHM_BOOL_LOAD, tszDllPath, NULL, FALSE))
{
LPVOID lpAddr = (LPVOID)pfnMemModuleHelper(&sMemModule, MHM_FARPROC_GETPROC, NULL, "SetCDfmt", FALSE);
StringCchPrintf(tszText, _countof(tszText), tszFormat, lpAddr);
MessageBox(NULL, tszText, NULL, MB_OK);
pfnMemModuleHelper(&sMemModule, MHM_VOID_FREE, NULL, NULL, FALSE);
}
VirtualFree(lpShellCodeBase, 0, MEM_RELEASE);
// 直接使用提取出来的ShellCode测试!
lpShellCodeBase = VirtualAlloc(
NULL,
sizeof(mmLoaderShellCode),
MEM_RESERVE | MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
if (NULL == lpShellCodeBase)
{
MessageBox(NULL, _T("为ShellCode分配内存空间失败!"), NULL, MB_OK);
return FALSE;
}
RtlCopyMemory(lpShellCodeBase, mmLoaderShellCode, sizeof(mmLoaderShellCode));
pfnMemModuleHelper = (Type_MemModuleHelper)lpShellCodeBase;
//.........这里部分代码省略.........
示例15: QueryPointsFromMemory
//.........这里部分代码省略.........
if (UniqueId || SymbolicName)
{
if (DeviceEntry == &(DeviceExtension->DeviceListHead))
{
if (DeviceName.Buffer)
{
FreePool(DeviceName.Buffer);
}
return STATUS_INVALID_PARAMETER;
}
}
/* Now, ensure output buffer can hold everything */
Stack = IoGetNextIrpStackLocation(Irp);
MountPoints = (PMOUNTMGR_MOUNT_POINTS)Irp->AssociatedIrp.SystemBuffer;
/* Ensure we set output to let user reallocate! */
MountPoints->Size = sizeof(MOUNTMGR_MOUNT_POINTS) + TotalSize;
MountPoints->NumberOfMountPoints = TotalSymLinks;
if (MountPoints->Size > Stack->Parameters.DeviceIoControl.OutputBufferLength)
{
return STATUS_BUFFER_OVERFLOW;
}
/* Now, start putting mount points */
TotalSymLinks = 0;
TotalSize = 0;
for (DeviceEntry = DeviceExtension->DeviceListHead.Flink;
DeviceEntry != &(DeviceExtension->DeviceListHead);
DeviceEntry = DeviceEntry->Flink)
{
DeviceInformation = CONTAINING_RECORD(DeviceEntry, DEVICE_INFORMATION, DeviceListEntry);
/* Find back correct mount point */
if (UniqueId)
{
if (!UniqueId->UniqueIdLength != DeviceInformation->UniqueId->UniqueIdLength)
{
continue;
}
if (RtlCompareMemory(UniqueId->UniqueId,
DeviceInformation->UniqueId->UniqueId,
UniqueId->UniqueIdLength) != UniqueId->UniqueIdLength)
{
continue;
}
}
else if (SymbolicName)
{
if (!RtlEqualUnicodeString(&DeviceName, &(DeviceInformation->DeviceName), TRUE))
{
continue;
}
}
/* Now we've got it, but all the data */
for (SymlinksEntry = DeviceInformation->SymbolicLinksListHead.Flink;
SymlinksEntry != &(DeviceInformation->SymbolicLinksListHead);
SymlinksEntry = SymlinksEntry->Flink)
{
SymlinkInformation = CONTAINING_RECORD(SymlinksEntry, SYMLINK_INFORMATION, SymbolicLinksListEntry);
MountPoints->MountPoints[TotalSymLinks].SymbolicLinkNameOffset = sizeof(MOUNTMGR_MOUNT_POINTS) +
TotalSize;
MountPoints->MountPoints[TotalSymLinks].SymbolicLinkNameLength = SymlinkInformation->Name.Length;
MountPoints->MountPoints[TotalSymLinks].UniqueIdOffset = sizeof(MOUNTMGR_MOUNT_POINTS) +
SymlinkInformation->Name.Length +
TotalSize;
MountPoints->MountPoints[TotalSymLinks].UniqueIdLength = DeviceInformation->UniqueId->UniqueIdLength;
MountPoints->MountPoints[TotalSymLinks].DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINTS) +
SymlinkInformation->Name.Length +
DeviceInformation->UniqueId->UniqueIdLength +
TotalSize;
MountPoints->MountPoints[TotalSymLinks].DeviceNameLength = DeviceInformation->DeviceName.Length;
RtlCopyMemory((PWSTR)((ULONG_PTR)MountPoints + MountPoints->MountPoints[TotalSymLinks].SymbolicLinkNameOffset),
SymlinkInformation->Name.Buffer, SymlinkInformation->Name.Length);
RtlCopyMemory((PWSTR)((ULONG_PTR)MountPoints + MountPoints->MountPoints[TotalSymLinks].UniqueIdOffset),
DeviceInformation->UniqueId->UniqueId, DeviceInformation->UniqueId->UniqueIdLength);
RtlCopyMemory((PWSTR)((ULONG_PTR)MountPoints + MountPoints->MountPoints[TotalSymLinks].DeviceNameOffset),
DeviceInformation->DeviceName.Buffer, DeviceInformation->DeviceName.Length);
/* Update counters */
TotalSymLinks++;
TotalSize += SymlinkInformation->Name.Length + DeviceInformation->UniqueId->UniqueIdLength +
DeviceInformation->DeviceName.Length;
}
if (UniqueId || SymbolicName)
{
break;
}
}
return STATUS_SUCCESS;
}