Monitor process+driver+register

Azure云原生多智能体系统:AutoGen生产级落地实践 多智能体系统(MAS)作为分解复杂AI任务的核心范式,其工程化落地长期受限于状态管理、可观测性与合规治理三大瓶颈。AutoGen作为轻量高效的智能体编排框架,虽在开发侧表现优异,但缺乏企业级运维支撑能力。借助Azure原生服务——如Cosmos DB实现分布式状态持久化、Azure Monitor与OpenTelemetry构建端到端可追溯链路、Managed Identity与Key Vault落实零信任凭证管理——可系统性补足MAS生产短板。该方案已在金融风控等强监管场景验证,支持高并发、可审计、可扩缩 阅读详情
 *

hookzwcreateprocess.C

Author: <X-STAR/heartdbg>
Last Updated: 2007-11-17

This framework is generated by EasySYS 0.3.0
This template file is copying from QuickSYS 0.3.0 written by Chunhua Liu

*/
// ***************************************************************
// hookzwcreateprocess version: 1.0 ? date: 11/17/2007
// -------------------------------------------------------------
// Author:X-STAR/heartdbg
// E-MAIL:qqshow@live.com
// BLOG :http://hi.baidu.com/heartdbg
// -------------------------------------------------------------
// Copyright (C) 2007 - All Rights Reserved
// ***************************************************************
//
// ***************************************************************
#include "dbghelp.h"
#include "hookzwcreateprocess.h"
#include <stdio.h>
#include <stdarg.h>
#include <ntimage.h>
#include <ntiologc.h>

//
// A structure representing the instance information associated with
// a particular device
//

#define DWORD unsigned long
#define WORD unsigned short
#define BOOL unsigned long
#define BYTE unsigned char
#define MAXPATHLEN 256
#define SEC_IMAGE 0x01000000
int position;
int pos;
int      po;
KEVENT event ;
char *output;

extern NTSTATUS
ZwCreateSection(
                    OUT PHANDLE SectionHandle,
                    IN ACCESS_MASK DesiredAccess,
                    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
                    IN PLARGE_INTEGER MaximumSize OPTIONAL,
                    IN ULONG SectionPageProtection,
                    IN ULONG AllocationAttributes,
                    IN HANDLE FileHandle OPTIONAL
);



NTSTATUS
ObQueryNameString(
                     IN PVOID Object,
                     OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
                     IN ULONG Length,
                     OUT PULONG ReturnLength
);



NTSTATUS
DevCreateClose(
                          IN PDEVICE_OBJECT DeviceObject,
                          IN PIRP Irp
);

NTSTATUS
DevDispatch(
                          IN PDEVICE_OBJECT DeviceObject,
                          IN PIRP Irp
);

VOID RegMoniterOn();
VOID RegMoniterOff();
VOID ProcMoniterOn();
VOID ProcMoniterOff();
VOID ModMonitorOn();
VOID ModMonitorOff();

BOOLEAN bRegMon = FALSE;
BOOLEAN bProcMon= FALSE;
BOOLEAN bModMon = FALSE;

typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;

extern PServiceDescriptorTableEntry KeServiceDescriptorTable;

/*
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateProcess(
                    OUT PHANDLE ProcessHandle,
                    IN ACCESS_MASK DesiredAccess,
                    IN POBJECT_ATTRIBUTES ObjectAttributes,
                    IN HANDLE InheritFromProcessHandle,
                    IN BOOLEAN InheritHandles,
                    IN HANDLE SectionHandle OPTIONAL,
                    IN HANDLE DebugPort OPTIONAL,
                    IN HANDLE ExceptionPort OPTIONAL,
                    IN HANDLE Unknown
);*/
/*
NTSTATUS
ZwLoadDriver(
                IN PUNICODE_STRING DriverServiceName
);*/



typedef NTSTATUS (*ZWCREATEPROCESS)(
                                         OUT PHANDLE ProcessHandle,
                                         IN ACCESS_MASK DesiredAccess,
                                         IN POBJECT_ATTRIBUTES ObjectAttributes,
                                         IN HANDLE InheritFromProcessHandle,
                                         IN BOOLEAN InheritHandles,
                                         IN HANDLE SectionHandle OPTIONAL,
                                         IN HANDLE DebugPort OPTIONAL,
                                         IN HANDLE ExceptionPort OPTIONAL,
                                         IN HANDLE Unknown
);

NTSTATUS FakedZwCreateProcess(
                                    OUT PHANDLE ProcessHandle,
                                    IN ACCESS_MASK DesiredAccess,
                                    IN POBJECT_ATTRIBUTES ObjectAttributes,
                                    IN HANDLE InheritFromProcessHandle,
                                    IN BOOLEAN InheritHandles,
                                    IN HANDLE SectionHandle OPTIONAL,
                                    IN HANDLE DebugPort OPTIONAL,
                                    IN HANDLE ExceptionPort OPTIONAL,
                                    IN HANDLE Unknown
                                    );



typedef NTSTATUS (*ZWSETVALUEKEY)
(
                                    IN HANDLE KeyHandle,
                                    IN PUNICODE_STRING ValueName,
                                    IN ULONG TitleIndex OPTIONAL,
                                    IN ULONG Type,
                                    IN PVOID Data,
                                    IN ULONG DataSize
);

NTSTATUS FakedZwSetValueKey
(
                                    IN HANDLE KeyHandle,
                                    IN PUNICODE_STRING ValueName,
                                    IN ULONG TitleIndex OPTIONAL,
                                    IN ULONG Type,
                                    IN PVOID Data,
                                    IN ULONG DataSize
);

typedef NTSTATUS (*ZWLOADDRIVER)
(
                                IN PUNICODE_STRING DriverServiceName
);

NTSTATUS FakedZwLoadDriver
(                              
                                    IN PUNICODE_STRING DriverServiceName
);

ZWSETVALUEKEY RealZwSetValueKey;
ZWCREATEPROCESS RealZwCreateProcess;
ZWLOADDRIVER RealZwLoadDriver;


typedef struct _SECTION_IMAGE_INFORMATION {
PVOID EntryPoint;
ULONG StackZeroBits;
ULONG StackReserved;
ULONG StackCommit;
ULONG ImageSubsystem;
WORD SubsystemVersionLow;
WORD SubsystemVersionHigh;
ULONG Unknown1;
ULONG ImageCharacteristics;
ULONG ImageMachineType;
ULONG Unknown2[3];
} SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;

// Length of process name (rounded up to next DWORD)
#define PROCNAMELEN 20
// Maximum length of NT process name
#define NT_PROCNAMELEN 16
ULONG gProcessNameOffset;
void GetProcessNameOffset()
{

PEPROCESS curproc;
int i;
curproc = PsGetCurrentProcess();
for( i = 0; i < 3*PAGE_SIZE; i++ )
{
if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
{
gProcessNameOffset = i;
}
}
}


BOOLEAN GetFullName2(HANDLE handle,char * pch)
{
     
     ULONG uactLength;
     POBJECT_NAME_INFORMATION pustr;
     ANSI_STRING astr;
     PVOID pObj;
     NTSTATUS ns;
     ns = ObReferenceObjectByHandle( handle, 0, NULL, KernelMode, &pObj, NULL );
     if (!NT_SUCCESS(ns))
     {
          return FALSE;
     }
     pustr = ExAllocatePool(NonPagedPool,1024+4);
     
     if (pObj==NULL||pch==NULL)
          return FALSE;
     
     ns = ObQueryNameString(pObj,pustr,512,&uactLength);
     
     if (NT_SUCCESS(ns))
     {
          RtlUnicodeStringToAnsiString(&astr,(PUNICODE_STRING)pustr,TRUE);
          strcpy(pch,astr.Buffer);
     }
     ExFreePool(pustr);
     RtlFreeAnsiString( &astr );
     if (pObj)
     {
          ObDereferenceObject(pObj);
     }
     
     return TRUE;
}

/*
KeyHandle:hSection

*/

NTSTATUS GetFullName(HANDLE KeyHandle,char *fullname)
{
     NTSTATUS ns;
     PVOID pKey=NULL,pFile=NULL;
     UNICODE_STRING fullUniName;
     ANSI_STRING akeyname;
     ULONG actualLen;
     UNICODE_STRING dosName;

     fullUniName.Buffer=NULL;
     fullUniName.Length=0;
     fullname[0]=0x00;
     ns= ObReferenceObjectByHandle( KeyHandle, 0, NULL, KernelMode, &pKey, NULL ) ;
     if( !NT_SUCCESS(ns)) return ns;
     
     fullUniName.Buffer = ExAllocatePool( PagedPool, MAXPATHLEN*2);//1024*2
     fullUniName.MaximumLength = MAXPATHLEN*2;

     __try
     {
          
          pFile=(PVOID)*(ULONG *)((char *)pKey+20);
          pFile=(PVOID)*(ULONG *)((char *)pFile);
          pFile=(PVOID)*(ULONG *)((char *)pFile+36);
          
          
          ObReferenceObjectByPointer(pFile, 0, NULL, KernelMode);
          RtlVolumeDeviceToDosName(((PFILE_OBJECT)pFile)->DeviceObject,&dosName);
          //ns=ObQueryNameString( pFile, fullUniName, MAXPATHLEN, &actualLen );
          RtlCopyUnicodeString(&fullUniName, &dosName);
          RtlAppendUnicodeStringToString(&fullUniName,&((PFILE_OBJECT)pFile)->FileName);
          
          ObDereferenceObject(pFile);
          ObDereferenceObject(pKey );
          
          RtlUnicodeStringToAnsiString( &akeyname, &fullUniName, TRUE );
          if(akeyname.Length<MAXPATHLEN)
          {
               memcpy(fullname,akeyname.Buffer,akeyname.Length);
               fullname[akeyname.Length]=0x00;
          }
          else
          {
               memcpy(fullname,akeyname.Buffer,MAXPATHLEN);
               fullname[MAXPATHLEN-1]=0x00;
          }
          
          RtlFreeAnsiString( &akeyname );
          ExFreePool(dosName.Buffer);
          ExFreePool( fullUniName.Buffer );
          
          return STATUS_SUCCESS;
          
     }

     __except(1)
     {
          if(fullUniName.Buffer) ExFreePool( fullUniName.Buffer );
          if(pKey) ObDereferenceObject(pKey );
          return STATUS_SUCCESS;
          
     }

}

BOOL GoOrNot(char *fathername,char *procname)
{
     char buff[256] = {0};
     ULONG a;
     LARGE_INTEGER li;li.QuadPart=-10000;
     KeWaitForSingleObject(&event,Executive,KernelMode,0,0);
     
     strcpy(buff,fathername);
     strcat(buff,procname);
     
     strncpy(&output[8],buff,sizeof(buff));
     
     a = 1;
     memmove(&output[0],&a,4);
     while (1)
     {
          KeDelayExecutionThread(KernelMode,0,&li);
          memmove(&a,&output[0],4);
          if (!a)
          {
               break;
          }
     }
     
     memmove(&a,&output[4],4);
     KeSetEvent(&event,0,0);
     return a;
}


BOOL GetProcessName( PCHAR theName )
{
PEPROCESS curproc;
char *nameptr;
ULONG i;
KIRQL oldirql;
     
if( gProcessNameOffset )
{
curproc = PsGetCurrentProcess();
nameptr = (PCHAR) curproc + gProcessNameOffset;
strncpy( theName, nameptr, NT_PROCNAMELEN );
theName[NT_PROCNAMELEN] = 0; /* NULL at end */
return TRUE;
}
return FALSE;
}

DWORD GetDllFunctionAddress(char* lpFunctionName, PUNICODE_STRING pDllName)
{
HANDLE hThread, hSection, hFile, hMod;
SECTION_IMAGE_INFORMATION sii;
IMAGE_DOS_HEADER* dosheader;
IMAGE_OPTIONAL_HEADER* opthdr;
IMAGE_EXPORT_DIRECTORY* pExportTable;
DWORD* arrayOfFunctionAddresses;
DWORD* arrayOfFunctionNames;
WORD* arrayOfFunctionOrdinals;
DWORD functionOrdinal;
DWORD Base, x, functionAddress;
char* functionName;
STRING ntFunctionName, ntFunctionNameSearch;
PVOID BaseAddress = NULL;
SIZE_T size=0;

OBJECT_ATTRIBUTES oa = {sizeof oa, 0, pDllName, OBJ_CASE_INSENSITIVE};

IO_STATUS_BLOCK iosb;

//_asm int 3;
ZwOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT);

oa.ObjectName = 0;

ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0,PAGE_EXECUTE, SEC_IMAGE, hFile);

ZwMapViewOfSection(hSection, NtCurrentProcess(), &BaseAddress, 0, 1000, 0, &size, (SECTION_INHERIT)1, MEM_TOP_DOWN, PAGE_READWRITE);

ZwClose(hFile);

hMod = BaseAddress;

dosheader = (IMAGE_DOS_HEADER *)hMod;

opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);

pExportTable =(IMAGE_EXPORT_DIRECTORY*)((BYTE*) hMod + opthdr->DataDirectory[ IMAGE_DIRECTORY_ENTRY_EXPORT]. VirtualAddress);

// now we can get the exported functions, but note we convert from RVA to address
arrayOfFunctionAddresses = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfFunctions);

arrayOfFunctionNames = (DWORD*)( (BYTE*)hMod + pExportTable->AddressOfNames);

arrayOfFunctionOrdinals = (WORD*)( (BYTE*)hMod + pExportTable->AddressOfNameOrdinals);

Base = pExportTable->Base;

RtlInitString(&ntFunctionNameSearch, lpFunctionName);

for(x = 0; x < pExportTable->NumberOfFunctions; x++)
{
functionName = (char*)( (BYTE*)hMod + arrayOfFunctionNames[x]);

RtlInitString(&ntFunctionName, functionName);

functionOrdinal = arrayOfFunctionOrdinals[x] + Base - 1; // always need to add base, -1 as array counts from 0
// this is the funny bit. you would expect the function pointer to simply be arrayOfFunctionAddresses[x]...
// oh no... thats too simple. it is actually arrayOfFunctionAddresses[functionOrdinal]!!
functionAddress = (DWORD)( (BYTE*)hMod + arrayOfFunctionAddresses[functionOrdinal]);
if (RtlCompareString(&ntFunctionName, &ntFunctionNameSearch, TRUE) == 0)
{
ZwClose(hSection);
return functionAddress;
}
}

ZwClose(hSection);
return 0;
}



VOID OnUnload( IN PDRIVER_OBJECT DriverObject )
{
     UNICODE_STRING devlink;
DbgPrint("PRMonitor: OnUnload called/n");
     if (bRegMon)
     {
          RegMoniterOff();
     }
     if(bProcMon)
     {
          ProcMoniterOff();
     }
     if (bModMon)
     {
          ModMonitorOff();
     }
     RtlInitUnicodeString(&devlink,HOOKZWCREATEPROCESS_DOS_DEVICE_NAME_W);
     IoDeleteSymbolicLink(&devlink);
     if (DriverObject->DeviceObject)
     {
          IoDeleteDevice(DriverObject->DeviceObject);
     }
     
}

NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )
{
int i;
UNICODE_STRING dllName;
DWORD functionAddress;
     UNICODE_STRING devname;
     UNICODE_STRING devlink;
     PDEVICE_OBJECT devob ;
     NTSTATUS status ;
     //_asm int 3;
     DbgPrint("My Driver Loaded!");

     RtlInitUnicodeString(&devname,HOOKZWCREATEPROCESS_DEVICE_NAME_W);
     RtlInitUnicodeString(&devlink,HOOKZWCREATEPROCESS_DOS_DEVICE_NAME_W);

     status = IoCreateDevice(theDriverObject,
                                   256,
                                   &devname,
                                   FILE_DEVICE_HOOKZWCREATEPROCESS,
                                   0,
                                   TRUE,
                                   &devob);

     if (!NT_SUCCESS(status))
     {
          KdPrint(("Failed to create device ....."));
          return status ;
     }

     status = IoCreateSymbolicLink(&devlink,&devname);

     if (!NT_SUCCESS(status))
     {
          KdPrint(("Failed to create symboliclink ......."));
          IoDeleteDevice(devob);
          return status;
     }

     theDriverObject->MajorFunction[IRP_MJ_CREATE] =
     theDriverObject->MajorFunction[IRP_MJ_CLOSE] = DevCreateClose;
     theDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DevDispatch ;
     theDriverObject->DriverUnload = OnUnload;
     KeInitializeEvent(&event,SynchronizationEvent,1);



GetProcessNameOffset();


RtlInitUnicodeString(&dllName, L"//Device//HarddiskVolume1//Windows//System32//ntdll.dll");
functionAddress = GetDllFunctionAddress("ZwCreateProcessEx", &dllName);
position = *((WORD*)(functionAddress+1));

DbgPrint("ZwCreateProcessEx's Id:%d/n", position);

     RealZwCreateProcess = (ZWCREATEPROCESS)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + position));
     functionAddress = GetDllFunctionAddress("ZwLoadDriver",&dllName);
     pos = *((WORD*)((DWORD)ZwSetValueKey+1));
     po = *((WORD *)(functionAddress+1));

     DbgPrint("ZwSetValueKey's Id:%d/n", pos);
     DbgPrint("ZwLoadDriver's Id:%d/n",po);
     //DbgPrint("ZwLoadDriver's address is %d/n",ZwLoadDriver);

     RealZwSetValueKey = (ZWSETVALUEKEY)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos));
     RealZwLoadDriver =      (ZWLOADDRIVER)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + po));
     

return STATUS_SUCCESS;
}


NTSTATUS FakedZwCreateProcess(
                                    OUT PHANDLE ProcessHandle,
                                    IN ACCESS_MASK DesiredAccess,
                                    IN POBJECT_ATTRIBUTES ObjectAttributes,
                                    IN HANDLE InheritFromProcessHandle,
                                    IN BOOLEAN InheritHandles,
                                    IN HANDLE SectionHandle OPTIONAL,
                                    IN HANDLE DebugPort OPTIONAL,
                                    IN HANDLE ExceptionPort OPTIONAL,
                                    IN HANDLE Unknown
                                    )
{
     char aProcessName[PROCNAMELEN];
     char aPathName[MAXPATHLEN];
     
     GetFullName(SectionHandle,aPathName);

     GetProcessName(aProcessName);
     
     DbgPrint("ZwCreateProcess is called by %s/n",aProcessName);
     DbgPrint("The name is %s/n",aPathName);
     strcat(aProcessName,"##");
     if (GoOrNot(aProcessName,aPathName))
     {
          return RealZwCreateProcess(
               ProcessHandle,
               DesiredAccess,
               ObjectAttributes,
               InheritFromProcessHandle,
               InheritHandles,
               SectionHandle,
               DebugPort,
               ExceptionPort,
               Unknown
                                    );

     }
     else
     {

          ProcessHandle = NULL;
          return STATUS_SUCCESS;
     }
          
}

NTSTATUS FakedZwSetValueKey
(
IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName,
IN ULONG TitleIndex OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize
)
{
     char pch[MAXPATHLEN];
     char regValue[MAXPATHLEN];
     ANSI_STRING ansi;
     char aProcessName[PROCNAMELEN];
     GetFullName2(KeyHandle,pch);
     GetProcessName(aProcessName);
     DbgPrint("ZwSetValueKey is called by %s/n",aProcessName);

     RtlUnicodeStringToAnsiString(&ansi,ValueName,TRUE);
          if(ansi.Length<MAXPATHLEN)
          {
               memcpy(regValue,ansi.Buffer,ansi.Length);
               regValue[ansi.Length]=0x00;
          }
          else
          {
               memcpy(regValue,ansi.Buffer,MAXPATHLEN);
               regValue[MAXPATHLEN-1]=0x00;
          }
          
          RtlFreeAnsiString( &ansi );
     strcat(aProcessName,"$$");
     strcat(pch,regValue);
     if (GoOrNot(aProcessName,pch))
     {
          return RealZwSetValueKey(
                                         KeyHandle,
                                         ValueName,
                                         TitleIndex,
                                         Type,
                                         Data,
                                         DataSize);
     }
     else
     {
          return STATUS_ACCESS_DENIED;
     }

}

NTSTATUS FakedZwLoadDriver(IN PUNICODE_STRING DriverServiceName )
{
     char aProcessName[PROCNAMELEN];
     char aDrvname[MAXPATHLEN];
     ANSI_STRING ansi ;
     GetProcessName(aProcessName);
     RtlUnicodeStringToAnsiString(&ansi,DriverServiceName,TRUE);
     if(ansi.Length<MAXPATHLEN)
     {
          memcpy(aDrvname,ansi.Buffer,ansi.Length);
          aDrvname[ansi.Length]=0x00;
     }
     else
     {
          memcpy(aDrvname,ansi.Buffer,MAXPATHLEN);
          aDrvname[MAXPATHLEN-1]=0x00;
     }
     
          RtlFreeAnsiString( &ansi );
     DbgPrint("ZwLoadDriver is called by %s/n",aProcessName);
     DbgPrint("Driver name is %s/n",aDrvname);

     strcat(aProcessName,"&&");

     if (GoOrNot(aProcessName,aDrvname))
     {
          return RealZwLoadDriver(
                                        DriverServiceName
                                        );
     }
     else
     {
               return STATUS_ACCESS_DENIED;
     }


}

NTSTATUS
DevCreateClose(
                IN PDEVICE_OBJECT DeviceObject,
                IN PIRP Irp
)
{

          Irp->IoStatus.Status = 0;
          Irp->IoStatus.Information = 0 ;

          IoCompleteRequest(Irp,IO_NO_INCREMENT);

          return STATUS_SUCCESS ;

}

NTSTATUS
DevDispatch(
                IN PDEVICE_OBJECT DeviceObject,
                IN PIRP Irp
)
{
     UCHAR *buff =0;
     ULONG a;
     PIO_STACK_LOCATION psloc= IoGetCurrentIrpStackLocation(Irp);

     
     switch(psloc->Parameters.DeviceIoControl.IoControlCode)
     {
     case 1000:
          DbgPrint("IoControlCode 1000/n");
          if(!bProcMon)
          {
               buff = (UCHAR *)Irp->AssociatedIrp.SystemBuffer ;
               
               ProcMoniterOn();
               
               memmove(&a,&buff[4],4);
               output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
          
          
     
          }
               break;

          case 1001:
               DbgPrint("IoControlCode 1001/n");
               if (bProcMon)
               {
                    ProcMoniterOff();
                    
               }
               break;

          case 1002:
               DbgPrint("IoControlCode 1002/n");
               if (!bRegMon)
               {
                    buff = (UCHAR *)Irp->AssociatedIrp.SystemBuffer ;

                    RegMoniterOn();

                    memmove(&a,&buff[4],4);
                    output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);

               }
               break;

          case 1003:
               DbgPrint("IoControlCode 1003/n");
               if (bRegMon)
               {
                    RegMoniterOff();
                    
               }
               break;

          case 1004:
               DbgPrint("IoControlCode 1004/n");
               if (!bModMon)
               {
                    buff = (UCHAR *)Irp->AssociatedIrp.SystemBuffer ;
                    
                    ModMonitorOn();
                    
                    memmove(&a,&buff[4],4);
                    output=(char*)MmMapIoSpace(MmGetPhysicalAddress((void*)a),256,0);
               }
               break;
               
          case 1005:
               DbgPrint("IoControlCode 1005/n");
               if (bModMon)
               {
                    ModMonitorOff();
               }
               break;
          }
          
                                             

     Irp->IoStatus.Status = 0;
     IoCompleteRequest(Irp,IO_NO_INCREMENT);
     return STATUS_SUCCESS ;
}

VOID ModMonitorOn()
{
     DbgPrint("ModMonitorOn/n");
     _asm
     {
               CLI //disable interrupt
               MOV EAX, CR0 //move CR0 register into EAX
               AND EAX, NOT 10000H //disable WP bit
               MOV CR0, EAX

     }

     (ZWLOADDRIVER)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + po)) = FakedZwLoadDriver ;


     _asm
     {
          
               MOV EAX, CR0 //move CR0 register into EAX
               OR EAX, 10000H //enable WP bit
               MOV CR0, EAX //write register back
               STI //enable interrupt
     }
     bModMon =1 ;
}

VOID ModMonitorOff()
{
     DbgPrint("ModMonitorOff/n");
     _asm
     {
          CLI //disable interrupt
               MOV EAX, CR0 //move CR0 register into EAX
               AND EAX, NOT 10000H //disable WP bit
               MOV CR0, EAX
               
     }
     
     (ZWLOADDRIVER)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + po)) = RealZwLoadDriver ;
     
     
     _asm
     {
          
          MOV EAX, CR0 //move CR0 register into EAX
               OR EAX, 10000H //enable WP bit
               MOV CR0, EAX //write register back
               STI //enable interrupt
     }
     bModMon =0 ;
}

VOID RegMoniterOn()
{
     DbgPrint("RegMonitorON/n");
     _asm
     {
          
               CLI //disable interrupt
               MOV EAX, CR0 //move CR0 register into EAX
               AND EAX, NOT 10000H //disable WP bit
               MOV CR0, EAX //write register back
               
     }
                    
          (ZWSETVALUEKEY)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos)) = FakedZwSetValueKey ;
                    
                    
     _asm
     {
                         
               MOV EAX, CR0 //move CR0 register into EAX
               OR EAX, 10000H //enable WP bit
               MOV CR0, EAX //write register back
               STI //enable interrupt
     }
     bRegMon = 1 ;


}

VOID RegMoniterOff()
{
     DbgPrint("RegMonitorOff/n");
     _asm
     {
          
               CLI //disable interrupt
               MOV EAX, CR0 //move CR0 register into EAX
               AND EAX, NOT 10000H //disable WP bit
               MOV CR0, EAX //write register back
               
     }
                    
               (ZWSETVALUEKEY)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + pos)) = RealZwSetValueKey ;
                    
                    
     _asm
     {
                         
               MOV EAX, CR0 //move CR0 register into EAX
               OR EAX, 10000H //enable WP bit
               MOV CR0, EAX //write register back
               STI //enable interrupt
     }
     bRegMon = 0;

}

VOID ProcMoniterOn()
{
     DbgPrint("ProcMonitorOn/n");
     _asm
          
     {
          
               CLI //disable interrupt
               MOV EAX, CR0 //move CR0 register into EAX
               AND EAX, NOT 10000H //disable WP bit
               MOV CR0, EAX //write register back
               
     }
     
     (ZWCREATEPROCESS)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + position)) = FakedZwCreateProcess ;
     
     
     _asm
     {
          
               MOV EAX, CR0 //move CR0 register into EAX
               OR EAX, 10000H //enable WP bit
               MOV CR0, EAX //write register back
               STI //enable interrupt
     }


     bProcMon = 1;

}

VOID ProcMoniterOff()
{
     DbgPrint("ProcMonitorOff/n");
     _asm
          
     {
          
               CLI //disable interrupt
               MOV EAX, CR0 //move CR0 register into EAX
               AND EAX, NOT 10000H //disable WP bit
               MOV CR0, EAX //write register back
               
     }
     
     (ZWCREATEPROCESS)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + position)) = RealZwCreateProcess ;
     
     
     _asm
     {
          
               MOV EAX, CR0 //move CR0 register into EAX
               OR EAX, 10000H //enable WP bit
               MOV CR0, EAX //write register back
               STI //enable interrupt
     }

     bProcMon = 0;

}
ESP32-S3音频采集与WebSocket实时传输方案 音频采集与实时传输是物联网音视频应用的核心技术。基于I2S协议的音频采集系统通过数字接口实现高保真信号获取,而WebSocket协议则解决了传统HTTP在实时数据传输中的延迟问题。ESP32-S3芯片凭借其双核处理器和丰富外设接口,配合乐鑫ADF音频开发框架,可快速构建从硬件驱动到应用层的完整音频处理链路。在智能家居、工业监测等场景中,这种低延迟、高可靠的音频传输方案能有效支持远程监控、语音交互等关键功能。项目实践表明,通过优化I2S时钟稳定性和WebSocket缓冲策略,ESP32-S3系统可实现500m 阅读详情

相关推荐

ROS 2 Dashing:从参数声明到QoS强制的工程化演进

ROS 2 是面向机器人系统的分布式通信框架,其核心依赖于DDS中间件与标准化节点交互范式。理解其设计原理,关键在于把握‘声明式编程’与‘显式QoS配置’两大技术基石——前者通过参数声明(declare_parameter)实现编译期契约校验,提升配置可追溯性与IDE支持能力;后者以历史深度(History Depth)等QoS策略的强制设定,保障消息传输的可靠性、实时性与内存可控性。这些机制共同构成现代ROS 2节点的健壮性底座,广泛应用于AGV调度、无人机控制、手术机器人等对稳定性要求严苛的工业场景。本

tomfish 259

MmGetPhysicalAddress分析

代码如下: PHYSICAL_ADDRESSMmGetPhysicalAddress ( IN PVOID BaseAddress ){ PMMPTE PointerPte; PHYSICAL_ADDRESS PhysicalAddress; //判断是否在[0x80000000,0xA0000000)中,如果是,这段内存被映射到物理内存中[0,2000000...

weixin_34362790的博客 1427

regmonitor

注册表监控工具 regmonitor

MmAllocateContiguousMemory&&MmGetPhysicalAddress

 /////////////////////// 申请全局物理连续内存,用于D1预览及原始视频///////////////////// RtlZeroMemory(&g_DriverInfo,sizeof(g_DriverInfo)); PHYSICAL_ADDRESS pa;          //物理地址 pa.QuadPart = 0xFFFFFFFFFFFFFFFF; //@最大的可用的物理地址// g_DriverInfo.vaD1Buffer = MmAllocateContiguousMem

Iqian1314的专栏 3877

树莓派驱动DLPDLCR230NPEVM+framebuffer显示图片

DLPDLCR230NPEVM DLP® LightCrafter™ Display 230NP 是一个易于使用的紧凑型即插即用评估平台,适用于消费类产品、工业、医疗和物联网 (IoT) 市场中的各种超便携显示应用。此评估模块 (EVM) 采用 DLP230NP 芯片组,该芯片组由DLP230NP.23 1080p DMD、DLPC3436显示控制器和DLPA2005PMIC/LED 驱动器组成。此 EVM 外形小巧,配备生产就绪型光学引擎以及支持 18 位 RGB 并行视频接口...

L_Y000的博客 2620

【数字图像相关-OpenCorr学习笔记】Epipolar search原理+代码解析

OpenCorr是一个开源C++库,用于研究和开发数字图像相关(DIC)技术它提供了2D和立体声DIC的全功能模块,以及数字体积相关(DVC)。最近正在学习OpenCorr,为了更深层次地理解ICGN,我打算浅浅剖析Opencorr的代码,学习的过程中写下这篇学习笔记,以后忘记了还能回来看看。同时,作为一名在读研究生,希望能得到社区大佬的指点,以及跟同学们一起学习进步。这一期主要讲解Eipipolar search的原理,并且附上部分代码解析。

ywyywyy的博客 1359

subfunction

kernel 6.5 merge了上面的commit后,SF的行为有了个变化,以前active local sf的时候,auxiliary sub-device就会创建,现在要等到devlink reload之后。devlink会传DEVLINK_PORT_FLAVOUR_PCI_SF到kernel,创建local sf。

mishuang2017的博客 317

MavLink协议入门

MAVLink是一个非常轻量化的开源的消息协议,用于无人机之间的通信以及无人机机载设备之间的通信。

ffffffeiyu的博客 2478

驱动开发相关函数

驱动开发相关函数 标签: 驱动开发函数  分类: 开发资料2007-10-19 04:40函数速查: http://msdn2.microsoft.com/en-us/library/aa491184.aspx1.判断系统版本BOOLEAN<br />  RtlIsNtDdiVersionAvailable(<br />    IN ULONG  Version<br />    );<br />2.系统补丁版本BOOLEAN<br />  RtlIsServicePackVersionInstalled(

wlj1973的专栏 957

ZYNQ 7020 之 FPGA知识点重塑笔记一——串口通信

通信方式一般分为串行通信和并行通信。并行通信是指多比特数据同时通过并行线进行传送。这种传输方式通信线多、成本高,故不宜进行远距离通信,通常传输距离小于 30 米。串行通信是指数据在一条数据线上,一比特接一比特地按顺序传送的方式。这种运输方式通常节省传输线,大大降低使用成本,但数据传送速度慢。综上可知,串行通信主要应用于长距离、低速率的通信场合。本次实验我们主要讲解下串行通信。串行通信一般有2种通信方式:同步串行通信和异步串行通信。同步串行通信。

m0_51430584的博客 3097

(论文加源码)基于CNN和LSTM的脑电情绪识别(数据集为DEAP和seed)

论文及源码见个人主页:https://download.youkuaiyun.com/download/qq_45874683/84118637?spm=1001.2014.3001.5503 (论文加源码)基于CNN和LSTM的脑电情绪识别(数据集为DEAP和seed)4D-CRNN 目录 目录: 运行过程: 1. 运行1D文件(没有什么bug): 2. 再运行3D文件(没有出现bug): 3. 最后运行main文件(出现了两个bug)(前提需要配置好tensorflow的框架): 第一个bug是..

qq_45874683的博客 6366

MmGetPhysicalAddress x86 pae or no pae

; no pae nt!MmGetPhysicalAddress: 8083a918 55 push ebp 8083a919 8bec mov ebp,esp 8083a91b 8b4d08 mov ecx,dword ptr [ebp+8] ;BaseAddress 8083a91e 8bc1

G_Spider的专栏 2023

【100%通过率】华为OD机试真题 C++ 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

3分钟快速解决OBS Studio NVIDIA滤镜加载失败问题:从驱动到源码的完整指南

OBS Studio作为免费开源的直播录制软件,其NVIDIA VFX滤镜功能为视频创作者提供了强大的GPU加速特效支持。然而,许多用户在启用绿幕抠像和背景模糊等NVIDIA滤镜时遇到了加载失败的问题。本文将为你提供从环境检查到源码修复的完整解决方案,让你在3分钟内定位并解决这一常见技术难题。 ## 问题现象与核心影响 NVIDIA VFX滤镜是OBS Studio中利用GPU硬件加速的高级视

gitblog_00672的博客 483

AMD KFD的SDMA Packet 类型和定义解析

本文详细分析了AMD GPU架构中的SDMA(System Direct Memory Access)数据传输机制,重点介绍了其核心数据结构——SDMA Packet。SDMA通过8种主要Packet类型(包括内存拷贝、数据写入、屏障同步、中断触发等)实现高效主机-设备通信。每种Packet采用位域结构和联合体封装设计,在保证功能完整性的同时实现空间优化。这些Packet支持丰富的访问属性和扩展字段,适用于高性能数据搬运、内存初始化、任务同步、性能分析等场景,为GPU计算提供了灵活高效的数据传输解决方案。

图形/计算GPU的驱动与虚拟化技术分享园地 1255

【系统分析师】2025年上半年真题:案例分析-答案及详解(回忆版)

摘要: 试题一考查面向对象分析,涉及用例模型构建的四个阶段(识别参与者、合并需求、细化描述、调整模型),分析CRM系统的参与者与用例,并说明用例间的包含、扩展和泛化关系。 试题二探讨嵌入式Docker,包括容器的轻量性、可移植性及隔离性含义,10项措施与7个规范方面的对应关系,以及优化容器切换时间的三种方法(如无状态连接优化)。 试题三聚焦数据库设计,分析订单表的函数依赖与范式分解(BCNF),讨论分解后是否保持函数依赖及无损性,并针对触发器的性能缺陷提出优化方案。 试题四解析Web开发中的MVC架构与SS

数据知道的博客 6612

CANN driver 硬件驱动怎么在操作系统内核和昇腾NPU芯片之间架起一条零拷贝的数据高速公路

由于装饰器在模块被首次读取时由解释器来加载,所以它们的使用应受限于通用的包装器(wrapper)。如果装饰器与方法的类或所增强的函数签名绑定,那么应该将其重构为常规的可调用对象,以避免复杂性。在任何情况下,装饰器在处理 API 时,一个好的做法是将它们聚集在一个易于维护的模块中。常见的装饰器模式如下所示。• 参数检查。• 缓存。• 代理。• 上下文提供者。参数检查检查函数接受或返回的参数,在特定上下文中执行时可能有用。举个例子,如果一个。

2501_92093170的博客 184

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

验证学习问题记录

查机制:Monitor 是否通过 Interface 的进行采样?查参数:Clocking block 的input skew是否是#1step?(确保在Pre-step采样稳定值)。查代码:Monitor 里有没有误用vif.data替代?衡量验证完成度,本质上是这五个维度的交集验证完成,可以投片(Tape-out)。在实际项目中,SVA 不仅用于Simulation(动态仿真)报错,它还可以直接喂给Formal Verification(形式验证)

qq_43543105的博客 325

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux DeviceMapper框架深度解析:从内核源码到存储管理实战

在Linux存储系统中,设备映射(Device Mapping)是实现逻辑卷管理的核心技术基础。DeviceMapper作为Linux内核的通用设备映射框架,通过模块化的插件机制为存储管理提供了统一的架构支持。其核心原理是在物理块设备与上层应用之间建立虚拟映射层,透明处理IO请求的过滤、重定向和转换操作。这一设计使得开发者能够专注于业务逻辑实现,而无需重复开发完整的设备驱动,显著提升了存储功能的开发效率和系统可维护性。在实际应用中,DeviceMapper支撑了包括dm-crypt磁盘加密、dm-verit

weixin_30784501的博客 442

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Zephyr RTOS日志系统深度解析:如何构建高效的嵌入式调试解决方案?

在嵌入式系统开发中,调试往往是最具挑战性的环节之一。当设备在野外运行出现故障时,缺乏有效的日志记录意味着开发者将陷入"盲人摸象"的困境。Zephyr RTOS作为新一代可扩展、安全的实时操作系统,其日志系统设计如何解决这一痛点?本文将深入探讨Zephyr日志系统的架构设计、实现机制以及在实际工程中的应用技巧。 ## 问题诊断:嵌入式调试的三大核心挑战 嵌入式系统调试面临三个主要难题:资源受限环

gitblog_00892的博客 378

ATE test for the Constant On Timer based DCDC down converter(OM3756)

本文以OM3756芯片为例,介绍了DCDC转换器的ATE测试策略。OM3756是一款高效集成的降压型DCDC转换器,具有6MHz高开关频率、1.82V固定输出电压、低静态电流等特点,采用恒定导通时间(COT)控制技术。文章详细阐述了芯片的顶层架构,包括I/O焊盘、数字模块、模拟模块和混合信号模块。重点分析了PWM/PFM控制器的工作原理和DFT设计方法,其中I2C接口用于测试所有子模块。最后列出了完整的ATE测试套件,涵盖开短路测试、寄存器测试、校准测试、比较器测试等13个测试项目.

m0_37918394的博客 773

ESP-IDF构建系统终极指南:5个核心优势让嵌入式开发变得简单

你是否曾经为嵌入式项目的复杂构建过程感到头疼?面对各种编译选项、依赖管理和芯片兼容性问题,是不是觉得无从下手?别担心,ESP-IDF构建系统正是为了解决这些痛点而设计的!作为Espressif官方开发框架,ESP-IDF的开源项目构建系统通过深度集成CMake,为ESP32系列芯片提供了简单、高效的模块化开发体验。无论你是刚接触嵌入式开发的新手,还是经验丰富的工程师,这套构建系统都能让你的开发工作

gitblog_01135的博客 443

SC16IS752 树莓派 RDK X3PI 底层驱动

【代码】SC16IS752 树莓派 底层驱动。

qq_43231904的博客 78

【SystemVerilog】class+随机数+fatal/error/warning/info+clocking+super+virtual+with

全部由AI生成。

1615549892 430

【vllm】(v1 Executor)vLLM V1 Executor 深度分析 — Part3: Ray执行器与工具函数

vLLM V1 Executor 深度分析 — Part3: Ray执行器与工具函数

zhonglinzhang 456
上一篇: 监控远程线程代码
下一篇: Sample Hips With main code
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值