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

浙公网安备 33010602011771号