wfhaha
驱动牛犊
驱动牛犊
  • 注册日期2007-08-07
  • 最后登录2010-04-30
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望38点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
阅读:1722回复:1

DeviceIoControl导致蓝屏。。。

楼主#
更多 发布于:2008-04-03 17:06
DeviceIoControl导致蓝屏。。。
#define FILE_DEVICE_FILEMON    0x00008300
#define IOCTL_FILEMON_ADDPROTECTEDPATH (ULONG) CTL_CODE( FILE_DEVICE_FILEMON, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS ) 
#define IOCTL_FILEMON_DELPROTECTEDPATH (ULONG) CTL_CODE( FILE_DEVICE_FILEMON, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS ) 
#define IOCTL_FILEMON_GETPROTECTEDPATH (ULONG) CTL_CODE( FILE_DEVICE_FILEMON, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS )


typedef struct _FilemonNameParam{
    char  *SourceFileName;
    char  *CacheFileName;
}FilemonNameParam,*PFilemonNameParam;


#define LOGBUFSIZE       ((ULONG)(64*0x400-(3*sizeof(ULONG)+1)))

BOOL SetProtectPath(HANDLE SysHandle,char* Path,bool bAdd=true)
{
    DWORD nb;
    FilemonNameParam Dir;
    Dir.SourceFileName = (char *)malloc(256);
    strcpy(Dir.SourceFileName,Path);
    Dir.CacheFileName = NULL;
    if( !DeviceIoControl(SysHandle,bAdd?IOCTL_FILEMON_ADDPROTECTEDPATH:IOCTL_FILEMON_DELPROTECTEDPATH,
        &Dir,sizeof(FilemonNameParam),NULL,
        0,&nb,NULL) )
    {
        free(Dir.SourceFileName);
        return FALSE;
    }
    else{
        free(Dir.SourceFileName);
        return TRUE;
    }
}

BOOL GetProtectPath(HANDLE SysHandle,LPVOID LPOutBuffer,LPDWORD lpLen)
{
    DWORD length = 0;
    if( !DeviceIoControl(SysHandle,IOCTL_FILEMON_GETPROTECTEDPATH,
        NULL, 0, LPOutBuffer,LOGBUFSIZE,
        &length, NULL) )
    {
        return FALSE;
    }
    else{
        *lpLen = length;
        return TRUE;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE sysHandle;
    BeginMonitor(sysHandle);
    
    DWORD len = 0;
    char buf[256]={0};
    
    
    SetProtectPath(sysHandle,"d:\\wfpbs1.txt");
    SetProtectPath(sysHandle,"d:\\wfpbs2.txt");
    SetProtectPath(sysHandle,"d:\\wfpbs3.txt");

    GetProtectPath(sysHandle,buf,&len);
    printf("%s\n",buf);
    getch();
    return 0;
}

调用三次SetProtectPath都可以在驱动的case语句里面断点到。

但是调用最后一个的时候,就直接返回FALSE了,错误码是988。(没有进断点)
过一会就蓝屏了。

我才开始接触这个东西,麻烦指教。。。
wfhaha
驱动牛犊
驱动牛犊
  • 注册日期2007-08-07
  • 最后登录2010-04-30
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望38点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-03 17:08
但是调用最后一个的时候

就是调用GetProtectPath的时候
游客

返回顶部