几个重要的函数

原创 2004年10月14日 02:24:00

几个重要的函数:

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 [特别划来的几个底层函数很有用,有公开的、也有没公开的,有用就收起来]

 

±        NtQueryDirectoryFile

±        WINNT里在某些目录中寻找某个文件的方法是枚举它里面所有的文件和它的子目录下的所有文件。文件的枚举是使用NtQueryDirectoryFile函数。

NTSTATUS NtQueryDirectoryFile(
  IN HANDLE FileHandle,
  IN HANDLE Event OPTIONAL,
  IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  IN PVOID ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  OUT PVOID FileInformation,
  IN ULONG FileInformationLength,
  IN FILE_INFORMATION_CLASS FileInformationClass,
  IN BOOLEAN ReturnSingleEntry,
  IN PUNICODE_STRING FileName OPTIONAL,
  IN BOOLEAN RestartScan
 );

对我们来说重要的参数是FileHandle,FileInformationFileInformationClassFileHandle是从NtOpenFile获得的目录对象句柄。FileInformation是一个指针,指向函数要写入需要的数据的已分配内存。FileInformationClass决定写入FileImformation的记录的类型。

//---------------------------------------------------------------------------------------------------------------------------------------

±         NtQuerySystemInformation

±         各种进程信息是通过NtQuerySystemInformation获取的。

NTSTATUS NtQuerySystemInformation(
  IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  IN OUT PVOID SystemInformation,
  IN ULONG SystemInformationLength,
  OUT PULONG ReturnLength OPTIONAL
 );

SystemInformationClass标明了我们想要获得的信息的类别,SystemInformation是一个指向函数输出缓冲区的指针,SystemInformationLength是这个缓冲区的长度,ReturnLength是写入字节的数目。 对于正在运行的进程的枚举我们使用设置为SystemProcessesAndThreadsInformationSystemInformationClass

//---------------------------------------------------------------------------------------------------------------------------------------

±         NtEnumerateKey

±         因为注册表的结构我们不能请求某个指定部分所有键的列表。我们只能在注册表某个部分通过查询指定键的索引以获得它的信息。这里提供了NtEnumerateKey

NTSTATUS NtEnumerateKey(
  IN HANDLE KeyHandle,
  IN ULONG Index,
  IN KEY_INFORMATION_CLASS KeyInformationClass,
  OUT PVOID KeyInformation,
  IN ULONG KeyInformationLength,
  OUT PULONG ResultLength
 );

KeyHandle是已经用索引标明我们想要从中获取信息的子键的句柄。KeyInformationClass标明了返回信息类型。数据最后写入KeyInformaiton缓冲区,缓冲区长度为KeyInformationLength。写入的字节数由ResultLength返回。

//---------------------------------------------------------------------------------------------------------------------------------------

±         NtVdmControl

±         DOS的枚举NTVDM能够通过函数NtVdmControl也能获得文件的列表

NTSTATUS NtVdmControl(  
  IN ULONG ControlCode,
  IN PVOID ControlData
 );

 ConcrolCode标明了在缓冲区ControlData中申请数据的子函数。如果ControlCodeVdmDiretoryFile那么这个函数的功能将和FileInformation设置为FileBothDirectoryInformation的函数NtQueryDirectoryFile功能一样。

//---------------------------------------------------------------------------------------------------------------------------------------

±         NtDeviceIoControlFile

±         MSDN-2004中有此函数的详细说明

NTSTATUS NtDeviceIoControlFile(      

    HANDLE FileHandle,

    HANDLE Event,

    PIO_APC_ROUTINE ApcRoutine,

    PVOID ApcContext,

    PIO_STATUS_BLOCK IoStatusBlock,

    ULONG IoControlCode,

    PVOID InputBuffer,

    ULONG InputBufferLength,

    PVOID OutputBuffer,

    ULONG OutputBufferLength

);

 

//---------------------------------------------------------------------------------------------------------------------------------------

±         NtQueryInformationProcess

±         我们需要通过NtQueryInformationProcess获取目标进程的PEB(进程环境块)

NTSTATUS NtQueryInformationProcess(
  IN HANDLE ProcessHandle,
  IN PROCESSINFOCLASS ProcessInformationClass,
  OUT PVOID ProcessInformation,
  IN ULONG ProcessInformationLength,
  OUT PULONG ReturnLength OPTIONAL
 );

 

 

//---------------------------------------------------------------------------------------------------------------------------------------

±         NtQueryInformationThread

±         NtQueryInformationThread能给我们指定线程是属于哪个进程的信息

NTSTATUS NtQueryInformationThread(
  IN HANDLE ThreadHandle,
  IN THREADINFOCLASS ThreadInformationClass,
  OUT PVOID ThreadInformation,
  IN ULONG ThreadInformationLength,
  OUT PULONG ReturnLength OPTIONAL
 );

//---------------------------------------------------------------------------------------------------------------------------------------

±         LdrLoadDll

±         其他模块都是在进程被挂钩之后在运行过程中才被动态加载的。这就是我们还得挂钩加载新模块的函数LdrLoadDll的原因

NTSTATUS LdrLoadDll(
  PWSTR szcwPath,
  PDWORD pdwLdrErr,  
  PUNICODE_STRING pUniModuleName,
  PHINSTANCE pResultInstance
 );

 

//---------------------------------------------------------------------------------------------------------------------------------------

±         NtFsControlFile

±         NtFsControlFile is used with FSCTL_XXX codes only!(They generate different IRP_MJ_XXX requests).

±         This function is used to send File System Control (FSCTL) commands into file system drivers. Its definition is in ntdll.dll (ntdll.lib), a file shipped with the NTDDK

No.1

NTSTATUS NtFsControlFile(

           HANDLE FileHandle,

           HANDLE Event,                               // optional

           PIO_APC_ROUTINE ApcRoutine,         // optional

           PVOID ApcContext,                         // optional

           PIO_STATUS_BLOCK IoStatusBlock,  

           ULONG FsControlCode,

           PVOID InputBuffer,                          // optional

           ULONG InputBufferLength,

           PVOID OutputBuffer,                        // optional

           ULONG OutputBufferLength

);

No.2

NTSTATUS NtFsControlFile(

    IN HANDLE FileHandle,

    IN HANDLE Event OPTIONAL,

    IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,

    IN PVOID ApcContext OPTIONAL,

    OUT PIO_STATUS_BLOCK IoStatusBlock,

    IN ULONG IoControlCode,

    IN PVOID InputBuffer OPTIONAL,

    IN ULONG InputBufferLength,

    OUT PVOID OutputBuffer OPTIONAL,

    IN ULONG OutputBufferLength

    );

 

//---------------------------------------------------------------------------------------------------------------------------------------

±         KeAddSystemServiceTable

±         函数KeAddSystemServiceTable允许Win32.sys和其他设备驱动程序添加系统服务表。除了Win32k.sys服务表外,使用KeAddSystemServiceTable添加的服务表会被同时复制到KeServiceDescriptorTableKeServiceDescriptorTableShadow中去。

BOOL _KeAddSystemServiceTable

(

LPSSTAT         lpAddressTable,          // Pointer to the SSTAT structure of the SST.

BOOL               bUnknown,                // Unknown. Always set  to FALSE. If you have

                                                  // any information regarding this please let me know.

DWORD           dwNumEntries,            // Number of entries in the SST.

LPSSTPT          lpParameterTable,       // Pointer to the SSTPT structure of the SST.

DWORD            dwTableID                // Index of the SSD to add the SST to.

}

 

 

Windows内核函数

字符串处理在驱动中一般使用的是ANSI字符串和宽字节字符串,在驱动中我们仍然可以使用C中提供的字符串操作函数,但是在DDK中不提倡这样做,由于C函数容易导致缓冲区溢出漏洞,针对字符串的操作它提供了一组...
  • lanuage
  • lanuage
  • 2016年11月30日 20:32
  • 731

C++中为什么不允许通过返回类型重载函数的辩论

2004-07-05 13:25:31 别逗了问个问题:1。C++中为什么不允许通过返回类型重载函数?2。为什么不允许通过返回类型解析模板函数? 2004-07-05 14:47:55 完美废人返回...
  • wingfiring
  • wingfiring
  • 2004年07月08日 14:49
  • 7580

已定义的函数有返回值,函数调用可以作为一个函数的实参,但是不能作为形参

1、问题描述 若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D ) A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达...
  • xy010902100449
  • xy010902100449
  • 2015年06月10日 20:31
  • 11348

几个比较重要的设计模式的总结与应用

1. 设计模式分为创建型,结构型,行为型。   2. 创建型 2.1 工厂方法。生产同一接口的不同产品。 如:Spring Aop中AopProxyFactory(具体实现类为Defaul...
  • sum_rain
  • sum_rain
  • 2015年05月04日 22:24
  • 1512

几个重要的函数:

特别划来的几个底层函数很有用,有公开的、也有没公开的,有用就收起来] ±        NtQueryDirectoryFile±        在WINNT里在某些目录中寻找某个文件的方法是枚举它里...
  • huntjap
  • huntjap
  • 2004年12月14日 17:10
  • 624

C++为什么不能通过函数返回值区分函数重载?

函数的两个要素:参数与返回值。    如果同名函数的参数不同(包括类型、顺序不同),那么容易区别出它们是不同的函数。   如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如: ...
  • sinat_20265495
  • sinat_20265495
  • 2016年09月09日 15:16
  • 3683

不能返回函数内部new分配的内存的引用

以前在开发电子秤接口动态库时,曾尝试在用于获取重量的函数外面定义一个字符串指针,然后作为参数传入函数内部,然后在函数内部new,用来输出函数执行过程中发生的错误。但是总是出错,没有找到原因,后来无意中...
  • yobsun
  • yobsun
  • 2016年07月13日 21:42
  • 469

struts 中常用的几个类

ActionMapping类将特定请求映射到特定Action的相关信息存储在 ActionMapping中,ActionServelt将ActionMapping传送到Action类的execute(...
  • gaojie0802
  • gaojie0802
  • 2007年07月13日 08:52
  • 499

C++中几个重要的概念(一)

我们先来读一小段代码吧,从而引出几个概念: template class PFArray { public: PFArray(); PFArray(int capacityValue ); P...
  • cyongxue
  • cyongxue
  • 2013年11月26日 11:08
  • 1290

函数返回值return后的内容不能指向“栈内存”

1.栈内存如果返回是不安全的(代码如下:) 此时会有如下警告信息 该内存在函数体结束时被自动销毁。(如果在使用它的时候,没有任何意义)  2.如果接下来我在main函数中...
  • u014536527
  • u014536527
  • 2015年11月24日 19:07
  • 569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:几个重要的函数
举报原因:
原因补充:

(最多只允许输入30个字)