内核下读文件,浮点运算和Sleep实现的代码实现—for backup

@作者: ay @文章出处: cnss-ay.com @Notice: 转载请注明出处

--------------------------------------读文件----------------------------------------------------

   NTSTATUS Status ;
   HANDLE fhandle ;
   UNICODE_STRING     ConfigFileName ;
   OBJECT_ATTRIBUTES  objAttr  ;
   IO_STATUS_BLOCK    ioStatusBlock ; 
   FILE_STANDARD_INFORMATION FileInfo ;
   LONG  BytesRead ;
   UCHAR *buf  = NULL ;
   RtlInitUnicodeString( &ConfigFileName, FilePath ) ;  
   InitializeObjectAttributes(
       &objAttr,
       &ConfigFileName,
       OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
       NULL,
       NULL ) ;
   Status = ZwCreateFile(
       &fhandle ,
       SYNCHRONIZE | FILE_READ_DATA,
       &objAttr,
       &ioStatusBlock,
       NULL,
       FILE_ATTRIBUTE_NORMAL,
       0,
       FILE_OPEN_IF,
       FILE_SYNCHRONOUS_IO_NONALERT,
       NULL,
       0
       ) ;
if( !NT_SUCCESS(Status) )
   {
       DbgPrint("Create file filed \n") ;
       *BufferAddress = NULL ;
       *BufferSize = 0 ;
return ;
   }
   Status = ZwQueryInformationFile(fhandle,
       &ioStatusBlock,
       &FileInfo,
sizeof(FILE_STANDARD_INFORMATION),
       FileStandardInformation);
//注意 这里只取了低位.一般文件大不过4G 
   BytesRead = FileInfo.EndOfFile.LowPart ;
   buf = ExAllocatePool(PagedPool  , BytesRead) ;
//NdisAllocateMemory(&buf,BytesRead,TAG);
   ZwReadFile(
       fhandle ,
       NULL , 
       NULL ,
       NULL ,
       &ioStatusBlock ,
       buf ,
       BytesRead , 
       NULL ,
       NULL 
       ) ;
   *BufferAddress = buf ;
   *BufferSize = BytesRead ;
   ZwClose(fhandle) ;

这个功能只不过是在内核下分配个内存 然后把文件内容读到内存中
要记得释放空间啊 我的代码中没释放分配的内存

当然后面有人留言说内核下用section读写也是个不错的选择

 

--------------------------------------浮点运算----------------------------------------------------

 KFLOATING_SAVE saveData ;
 NTSTATUS status;
 int i = 0 ;
 double tem = 0 , sum = 0  ;

 //////////开启浮点运算环境
     status = KeSaveFloatingPointState(&saveData);

 if ( ! NT_SUCCESS(status))
 return ;

 //浮点运算操作

 //////////关闭浮点运算环境
     KeRestoreFloatingPointState(&saveData);

内核下进行浮点运算很特殊~~
正确操作应该向上面代码一样

 

--------------------------------------Sleep函数----------------------------------------------------
在贴个抄来的内核sleep()函数,不好意思的是忘了从哪贴过来的了。。。。

 void KeSleep(ULONG uMiniseconds)
 {
     KTIMER ktimer;
     LARGE_INTEGER liTimerout;
     liTimerout.QuadPart=-(LONG)(uMiniseconds*10000);
     KeInitializeTimer(&ktimer);
     KeWaitForSingleObject(&ktimer,Executive,KernelMode,FALSE,&liTimerout);
 }

不过效率貌似有待改进....有时间在说吧~~那个xxxdelay函数也可以实现延迟的的

posted @ 2011-10-15 00:23  __ay  阅读(246)  评论(0编辑  收藏  举报