内核下读文件,浮点运算和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函数也可以实现延迟的的