首页
社区
课程
招聘
[原创]遍历系统中的回调
2012-4-3 22:24 27689

[原创]遍历系统中的回调

2012-4-3 22:24
27689
目的:
     遍历系统中的回调
类型:
     与Xuetr遍历到的类型相同

     如有雷同,还望见谅。。。有错误或者不恰当的地方请指正。
     附件中代码大量冗余,可以将相同的部分写成一个函数,一开始没注意,懒得改了。。。

详细实现见代码

环境:
     WIN XP SP3   大量使用硬编码,本次仅在于实现我的虚拟机环境下的遍历,没有考虑寻找通用方法。

参考资料:1、WRK 1.2   
          2、React OS  
          3、标 题:替换进程创建监视函数
          作 者:鹿剑
          链 接:http://bbs.pediy.com/showthread.php?t=93759
将包括:
        1.创建进程、创建线程、加载模块回调
        2.注册表回调
        3.错误检测回调
        4.Lego回调
        5.关机回调
        6.注销回调
        7.文件系统改变回调
        8.即插即用回调(还未完成,忘大家给些提示,我好补充完整

        8.已经完成,见下面:(从2000里面抄抄捡捡,大牛莫笑。。。
       
其实实现起来都差不多,一个链表头串起来,好几种只是结构不同而已

1、创建进程、创建线程、加载模块回调
(1)创建进程回调
   注册创建进程回调使用函数 PsSetCreateProcessNotifyRoutine,调用这个函数会将注册的信息保存到一个数组里面。
反汇编这个函数,会发现以下片段:
805d0c27 56              push    esi
805d0c28 57              push    edi
805d0c29 7464            je      nt!PsSetCreateProcessNotifyRoutine+0x73 (805d0c8f)
805d0c2b bf404a5680      mov     edi,offset nt!PspCreateProcessNotifyRoutine (80564a40)   
805d0c30 57              push    edi

PspCreateProcessNotifyRoutine (80564a40)即这个数组的地址,这个数组是以下结构:
ypedef struct _EX_FAST_REF
{
    union
    {
        PVOID Object;
        ULONG_PTR RefCnt:3;
        ULONG_PTR Value;
    };
} EX_FAST_REF, *PEX_FAST_REF;

低三位RefCnt是引用指针,Value指向一个结构,如下:
typedef struct _EX_CALLBACK_ROUTINE_BLOCK
{
    EX_RUNDOWN_REF RundownProtect;
    PEX_CALLBACK_FUNCTION Function;
    PVOID Context;
} EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK;
可以看到保存了回调函数的地址

因而采用搜索数组的方式在进行遍历即可,因为在WIN XP SP3中数组元素为8个,所以遍历的时候就按八个来的,WIN 7就不是了
(2)创建线程和加载模块一样,略过。。。

2、注册表回调
一开始真不知道哪个函数是注册注册表回调,尝试着在MSDN以cm(Xuetr回调类型里就是cmpCallBack)开头看到了CmRegisterCallback,大致看了一下,跟上面的原理一样。。不过是不是八个元素没注意,按八个处理的

3、错误检测回调
函数是:
KeRegisterBugCheckCallback               
KeRegisterBugCheckReasonCallback
反汇编KeRegisterBugCheckCallback :
804fa138 c7400458d75580  mov     dword ptr [eax+4],offset nt!KeBugCheckCallbackListHead (8055d758)


又一个链表头,查看WRK ,这里没有考虑WRK与WIN XP 在该函数上可能的差异。。。得到以下信息:
/
*
NTKERNELAPI
BOOLEAN
KeRegisterBugCheckCallback (
    __out PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
    __in PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
    __in PVOID Buffer,
    __in ULONG Length,
    __in PUCHAR Component
    )
typedef struct _KBUGCHECK_CALLBACK_RECORD {
    LIST_ENTRY Entry;
    PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
    PVOID Buffer;
    ULONG Length;
    PUCHAR Component;
    ULONG_PTR Checksum;
    UCHAR State;
} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;

LIST_ENTRY KeBugCheckCallbackListHead;
LIST_ENTRY KeBugCheckReasonCallbackListHead;

结构类型就很清楚了,得到链表头,按照双向链表便利即可

4、Lego回调
刚从XUETR里面看到这个还真不知道是什么,搜索一番后,得到了MJ的一些说明:

ULONG PsSetLegoNotifyRoutine(PVOID notifyroutine)
notifyroutine为需要设置的回调函数地址
返回值是_ETHREAD->Tcb->LegoData的偏移量
调用此函数,系统会将一个未导出的全局变量_PspLegoNotifyRoutine设置为你设定的回调函数地址
当一个线程的_ETHREAD->Tcb->LegoData不为空,且_PspLegoNotifyRoutine不为空,那么当这个线程调用PspExitThread退出时,会调用PspLegoNotifyRoutine中的回调函数
系统中只允许设置一个这样的回调函数
有人跟着给出具体结构和定义:
typedef VOID (*PLEGO_NOTIFY_ROUTINE)( PKTHREAD Thread );
ULONG PsSetLegoNotifyRoutine( PLEGO_NOTIFY_ROUTINE LegoNotifyRoutine ) 
{ 
    PAGED_CODE(); 
    PspLegoNotifyRoutine = LegoNotifyRoutine; 
    return FIELD_OFFSET(KTHREAD,LegoData); 
} 
硬编码搜索到这个全局变量,查看地址是否为0即可(不知是否有误,或者加上地址有效检测?)
nt!PsSetLegoNotifyRoutine:
805d299a 8bff            mov     edi,edi
805d299c 55              push    ebp
805d299d 8bec            mov     ebp,esp
805d299f 8b4508          mov     eax,dword ptr [ebp+8]
805d29a2 a3c0d26780      mov     dword ptr [nt!PspLegoNotifyRoutine (8067d2c0)],eax//这里
805d29a7 b8d0000000      mov     eax,0D0h
805d29ac 5d              pop     ebp
805d29ad c20400          ret     4


5、关机回调
有两个函数:
IoRegisterShutdownNotification
IoRegisterLastChanceShutdownNotification
来看第一个:
相关结构和定义也是参考了WRK。。。。
LIST_ENTRY IopNotifyShutdownQueueHead;
LIST_ENTRY IopNotifyLastChanceShutdownQueueHead;

typedef struct _SHUTDOWN_PACKET {
    LIST_ENTRY ListEntry;
    PDEVICE_OBJECT DeviceObject;
} SHUTDOWN_PACKET, *PSHUTDOWN_PACKET;


要得到回调函数地址,需要得到设备对象,回调函数地址即IRP_MJ_SHUTDOWN的例程地址
//#define IRP_MJ_SHUTDOWN                 0x10

代码如下:
ULONG GetNotifyAddr(PDEVICE_OBJECT Device_Object)
{
	ULONG Addr;
	PDRIVER_OBJECT Driver_Object;
	Driver_Object=Device_Object->DriverObject;
	Addr=*(ULONG*)((ULONG)Driver_Object+0x38+0x40);
	return Addr;
}


6、注销回调
搜了N久也不知道是哪个函数,于是看了看Xuetr,只有mrxsmb.sys注册了注销回调,查看其导入表看看有没有跟注册相关的字眼,于是找到了SeRegisterLogonSessionTerminatedRoutine
,查了一下,果然是。
也是一个链表头的形式,相关结构和定义:
typedef NTSTATUS (*PSE_LOGON_SESSION_TERMINATED_ROUTINE) (
  IN PLUID LogonId
  );
typedef struct _SEP_LOGON_SESSION_TERMINATED_NOTIFICATION {
    struct _SEP_LOGON_SESSION_TERMINATED_NOTIFICATION *Next;
    PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine;
} SEP_LOGON_SESSION_TERMINATED_NOTIFICATION, *PSEP_LOGON_SESSION_TERMINATED_NOTIFICATION;

NTSTATUS
SeRegisterLogonSessionTerminatedRoutine(
    IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine
    );


7、文件系统改变回调
相关的注册函数是:IoRegisterFsRegistrationChange
结构:
typedef struct _NOTIFICATION_PACKET 
{
    LIST_ENTRY ListEntry;
    PDRIVER_OBJECT DriverObject;
    ULONG NotificationRoutine;
} NOTIFICATION_PACKET, *PNOTIFICATION_PACKET;

8、即插即用回调
(1)注册的函数应该是IoRegisterPlugPlayNotification(由于搞不定,我都开始怀疑了。。。)
一开始想用上面的方法找到链表头,遍历链表即可,但是发现结果不对。。。
我找的是IopDeferredRegistrationList,是不是找错了?
WRK里面没有这个函数的实现,于是翻了翻React OS,找到参考的代码有这么几句:

InsertHeadList(&PnpNotifyListHead, &Entry->PnpNotifyList);
KeReleaseGuardedMutex(&PnpNotifyListLock);
DPRINT("IoRegisterPlugPlayNotification() returns NotificationEntry %p\n",
        Entry);
*NotificationEntry = Entry;


其中相关结构:
typedef struct _PNP_NOTIFY_ENTRY
{
    LIST_ENTRY PnpNotifyList;
    IO_NOTIFICATION_EVENT_CATEGORY EventCategory;
    PVOID Context;
    UNICODE_STRING Guid;
    PFILE_OBJECT FileObject;
    PDRIVER_NOTIFICATION_CALLBACK_ROUTINE PnpNotificationProc;
} PNP_NOTIFY_ENTRY, *PPNP_NOTIFY_ENTRY;


结果完全对不上。。。。。从ntoskrnl.exe中找到这个函数,无奈逆向太烂看不出来将注册信息保存到哪了。。。貌似是一个常量指向的地址。。。
(2)从函数实现来看,注册成功后,将相关结构的地址返回了,如果按照React OS的做法,这个结构是在整个链表里面的,结果自己注册了一个回调打算进行遍历,还是不行。。。。
还望大家指点。。。

其余结果都能和Xuetr对得上

8.即插即用回调
  今天下了一份2000源代码回来,找到了IoRegisterPlugPlayNotification函数的实现部分,发现了一个链表IopDeviceClassNotifyList,用Windbg查看这个链表,得到如下信息:

|------------------------|
1.8067d080 -> e1dd7698 ->--^
  8067d080 <- e1dd7698 <----
  |________________________|
     

  |------------------------------------------------|
2.e1336d98 -> e1036468 -> e1307548 -> 8067d090 ->--^
  e1307548 <- 8067d090 <- e1336d98 <- e1036468 <----
  |________________________________________________|
  
  
  |------------------------------------------------|
4.e1000888 -> e1f58478 -> e1bc04a0 -> 8067d0a0 ->--^
  e1bc04a0 <- 8067d0a0 <- e1000888 <- e1f58478 <----
  |________________________________________________|

  |------------------------|
5.e1537858 -> 8067d0a8 ->--^
  e1537858 <- 8067d0a8 <----
  |________________________|

  |------------------------|
6.e156e7c8 -> 8067d0b0 ->--^
  e156e7c8 <- 8067d0b0 <----
  |________________________|

   |------------------------|
10.e1315d60 -> 8067d0d0 ->--^
   e1315d60 <- 8067d0d0 <----
   |________________________|

   |------------------------------------------------|
11.e1002ad8 -> e156fc48 -> e1301258 -> 8067d0d8 ->--^
   e1301258 <- 8067d0d8 <- e1002ad8 <- e156fc48 <----
   |________________________________________________|

   
   |------------------------------------------------------------|
12.e1023c40 -> e131ae08 -> e101ea20 -> e1f752c8 -> 8067d0e0 ->--^
   e1f752c8 <- 8067d0e0 <- e1023c40 <- e131ae08 <- e101ea20 <----
   |____________________________________________________________|
一共17个,正好跟Xuetr对应上

而参照2000代码,IopDeviceClassNotifyList是一个具有13个(XP也是)元素的数组,每个都是一个链表,数据格式:
typedef struct _SETUP_NOTIFY_DATA
 {
    LIST_ENTRY ListEntry;
    IO_NOTIFICATION_EVENT_CATEGORY EventCategory;
    PDRIVER_NOTIFICATION_CALLBACK_ROUTINE Callback;
    PVOID Context;
    PDRIVER_OBJECT DriverObject;
    USHORT RefCount;
    BOOLEAN Unregistered;
    PFAST_MUTEX Lock;
} SETUP_NOTIFY_DATA, *PSETUP_NOTIFY_DATA;


但是偏移跟实际的对不上。。。应该有所更改了
通过计算注册时提供的ClassGuid得到不同的hash值,hash值相同的串在一个链表里

但是技术太烂,WinDbg在u IoRegisterPlugPlayNotification里面没看到IopDeviceClassNotifyList数组,但是发现还有一个函数:IopInitializePlugPlayNotification   这个函数没有导出,我用了最烂的方法,遍历内核模块空间,根据特征码得到函数地址

/*
nt!IopInitializePlugPlayNotification:
8058a5b4 6a0d            push    0Dh
8058a5b6 b880d06780      mov     eax,offset nt!IopDeviceClassNotifyList (8067d080)  
8058a5bb 59              pop     ecx
8058a5bc 894004          mov     dword ptr [eax+4],eax
*/
再得到IopDeviceClassNotifyList 数组地址,遍历即可。。。

另外有一个问题:
其中的一个PCALLBACK_RECORD:
0: kd> dd e1dd7698
e1dd7698  8067d080 8067d080 00000002 00000000
e1dd76a8  00000000 b2884fcc 00000000 81c26b10

  kd> dt _driver_object 81c26b10
nt!_DRIVER_OBJECT
   +0x000 Type             : 4
   +0x002 Size             : 168
   +0x004 DeviceObject     : 0x81b332d0 _DEVICE_OBJECT
   +0x008 Flags            : 0x10
   +0x00c DriverStart      : 0xf8ba4000 
   +0x010 DriverSize       : 0x1100
   +0x014 DriverSection    : 0x81f317c0 
   +0x018 DriverExtension  : 0x81c26bb8 _DRIVER_EXTENSION
   +0x01c DriverName       : _UNICODE_STRING "\Driver\swenum"
   +0x024 HardwareDatabase : 0x8067e260 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
   +0x028 FastIoDispatch   : (null) 
   +0x02c DriverInit       : 0xf8ba48dd     long  swenum!GsDriverEntry+0
   +0x030 DriverStartIo    : (null) 
   +0x034 DriverUnload     : 0xf8ba432a     void  swenum!DriverUnload+0
   +0x038 MajorFunction    : [28] 0xf8ba4768     long  swenum!DispatchCreate+0


而用XUETR得到的结果是属于sysaudio.sys模块。。。。。:


最后附代码,硬编码:
NTSTATUS GetPlugPlayCallBack(ULONG KernelAddress)
{

	//未导出
	UCHAR* Base=KernelAddress;
	ULONG i=0;
	ULONG NotifyAddr;//回调函数地址
	PSETUP_NOTIFY_DATA pPnpNotifyPack;
	PLIST_ENTRY pListEntry;
	PLIST_ENTRY pListNext;
	PULONG Address;
	int count;
	Address=0;
	
	if(KernelAddress!=0)
	{
	   for(i=0;i<0x20D000;i++)//内核大小硬编码了
	   {
		   
		  if((*(UCHAR*)Base==0x6a)&&(*(UCHAR*)(Base+1)==0x0d)&&(*(UCHAR*)(Base+2)==0xb8)&&(*(UCHAR*)(Base+7)==0x59)&&(*(UCHAR*)(Base+8)==0x89))
		  {
			 DbgPrint("找到IopInitializePlugPlayNotification地址%x\n",Base);
			 Address=*(ULONG*)(Base+3);
			 break;
		  }
		  Base++;
	   }
	}
	
	if(Address==0)
    {
	   DbgPrint("获取PlugPlay回调数组失败\n");
       return STATUS_UNSUCCESSFUL;
    }
	DbgPrint("PlugPlay回调数组地址%x\n",(ULONG)Address);
	//13个元素
	for(count=0;count<NOTIFY_DEVICE_CLASS_HASH_BUCKETS*2;count+=2)
	{
		//DbgPrint("PlugPlay回调数组元素%x\n",Address[count]);
        {
			pListEntry=Address[count];
			pListNext=pListEntry;
			if(pListNext->Flink!=pListEntry)
			{
			   DbgPrint("回调入口:%X  类型:PlugPlay  包地址:%X\n",*(ULONG*)((PULONG)pListNext+5),pListNext);
			   PlugPlayNum++;
			}
			pListNext=pListNext->Flink;
			while(pListNext->Flink!=pListEntry)
			{
				if(pListNext<KernelAddress+0x20D000)
				{	
					pListNext=pListNext->Flink;

				    DbgPrint("回调入口:%X  类型:PlugPlay  包地址:%X\n",*(ULONG*)((PULONG)pListNext+5),pListNext);
					pListNext=pListNext->Blink;
				}
				else
				{
					DbgPrint("回调入口:%X  类型:PlugPlay  包地址:%X\n",*(ULONG*)((PULONG)pListNext+5),pListNext);
				}
				PlugPlayNum++;
				pListNext=pListNext->Flink;
			}
		}
	}
	 
}

[培训]《安卓高级研修班(网课)》月薪三万计划

上传的附件:
收藏
点赞4
打赏
分享
最新回复 (28)
雪    币: 607
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
小覃 2 2012-4-3 22:36
2
0
看上去好像很不错........ 支持个!
雪    币: 130
活跃值: (1005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
哇咔咔zs 2012-4-4 04:33
3
0
严重支持
来个IO TIMER DCP TIMER更好
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天法道 2012-4-4 08:02
4
0
支持一下。

雪    币: 1867
活跃值: (1715)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 9 2012-4-4 17:39
5
0
看了下,定位数组的时候都是采用的硬编码,这样的话,通用性不太好。
上次逆向了下PowerTool的实现方法,它是首先自己调用PsSetxxx函数插入自己的回调,然后再寻找自己的回调的方法,挺巧妙的,兄弟可以借鉴下。
不过也有个缺点,就是数组中成员满了之后,插入自己的回调就会失败了。
这两个方法结合下就很好了。
雪    币: 853
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2012-4-5 10:24
6
0
多谢版主提示…我研究研究,另外,关于即插即用回调的问题,谁能给些提点?
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
jasonnbfan 8 2012-4-5 14:19
7
0
mark 一下,感谢共享。
雪    币: 208
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
viphack 4 2012-4-6 06:48
8
0
支持一下。。。
雪    币: 274
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wwwzhigang 2012-4-6 13:54
9
0
不错不错,向楼主学习了~~
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lmhmylsq 2012-4-9 16:59
10
0
支持楼主,多谢!
雪    币: 249
活跃值: (71)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
cxthl 2 2012-4-10 14:18
11
0
plugplay的回调该如何获得?求解释
雪    币: 853
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2012-4-11 15:40
12
0
我也在郁闷这个啊
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wowbellon 2012-4-13 08:50
13
0
正好需要这方面的资料,感谢分享,收下学习了
雪    币: 49
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ndayo 2012-4-13 10:09
14
0
收藏备用,感谢分享。
雪    币: 853
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2012-5-9 20:28
15
0
PlugPlay回调遍历方法补充完毕。。。
雪    币: 28
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iokey 2012-12-6 09:50
16
0
很详细,谢谢楼主分享。
雪    币: 716
活跃值: (1146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangzesen 2013-4-12 14:07
17
0
好东西,定
雪    币: 3761
活跃值: (484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
starscc 2013-6-9 23:01
18
0
不错,做个标记
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Chinghoi 2013-8-7 02:45
19
0
国际惯例, 强势插入! 刚好需要补充各种回调的枚举资料思路
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Chinghoi 2013-8-9 01:49
20
0
[QUOTE=futosky;1060342]引用:
"但是技术太烂,WinDbg在u IoRegisterPlugPlayNotification里面没看到IopDeviceClassNotifyList数组,但是发现还有一个函数:IopInitializePlugPlayNotification   这个函数没有导出,我用了最烂的方法,遍历内核模块空间,根据特征码得到函数地址
nt!IopInitializePlugPlayNotification:
8058a5b4 6a0d            push    0Dh
8058a5b6 b880d06780      mov     eax,offset nt!IopDeviceClassNotifyList (8067d080)
...
再得到IopDeviceClassNotifyList 数组地址,遍历即可。。。"[/QUOTE]

     最近在写枚举系统回调->即插即用,在WinDBG调试分析 IoRegisterPlugPlayNotification函数体时惊现对IopDeviceClassNotifyList数组地址的引用-_-!
纠正楼主在贴子中讲解的"在u IoRegisterPlugPlayNotification里面没看到IopDeviceClassNotifyList数组"的说法、、

代码:
0: kd> u IoRegisterPlugPlayNotification l 200
nt!IoRegisterPlugPlayNotification:
..
8058b3fd ff1518914d80    call    dword ptr [nt!_imp_ExAcquireFastMutex (804d9118)]
8058b403 8b4334          mov     eax,dword ptr [ebx+34h]
8058b406 034330          add     eax,dword ptr [ebx+30h]
8058b409 6a0d            push    0Dh
8058b40b 03432c          add     eax,dword ptr [ebx+2Ch]
8058b40e 59              pop     ecx
8058b40f 034328          add     eax,dword ptr [ebx+28h]
8058b412 33d2            xor     edx,edx
8058b414 f7f1            div     eax,ecx
8058b416 8d04d580d06780  lea     eax,nt![COLOR="Red"]IopDeviceClassNotifyList[/COLOR] (8067d080)[edx*8] // 地址8067d080跟LZ一样(Xp Sp3)
8058b41d 8b4804          mov     ecx,dword ptr [eax+4]
8058b420 894b04          mov     dword ptr [ebx+4],ecx
8058b423 8903            mov     dword ptr [ebx],eax
8058b425 8919            mov     dword ptr [ecx],ebx
8058b427 8bcf            mov     ecx,edi
8058b429 895804          mov     dword ptr [eax+4],ebx
8058b42c ffd6            call    esi
8058b42e f6450c01        test    byte ptr [ebp+0Ch],1
8058b432 0f8404020000    je      nt!IoRegisterPlugPlayNotification+0x4e2 (8058b63c)
...
雪    币: 853
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
futosky 3 2013-8-11 09:04
21
0
额   过去很久了,我印象中好像我虚拟机里的 XP 是没看到   看到过一个貌似数组的但是得不到正确数据

很久没碰电脑了,好思念有代码敲的日子~~
雪    币: 111
活跃值: (46)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
IDGHOST 2013-8-11 09:23
22
0
ObRegisterCallBacks也是创建一个回调的吧,发现好多工具都没有遍历这个。
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Chinghoi 2013-8-11 18:30
23
0
LZ的枚举即插即用貌似枚举出来的结构很奇怪且总是对不上呢少几个, 发现了两个与即插即用回调或相关的链表数据结构:IopProfileNotifyList与IopDeferredRegistrationList, 但还是少几个即插即用回调, LZ看看呗
雪    币: 733
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
非安全 17 2013-8-11 18:33
24
0
mark 一下,感谢共享。
雪    币: 350
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Chinghoi 2013-8-11 21:16
25
0
这么久也没回复, 楼主不会也改卖水果了吧
游客
登录 | 注册 方可回帖
返回