⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ifshook.cpp

📁 自动生成虚拟设备驱动(VXD)的C++代码的一个库
💻 CPP
字号:
//////////////////////////////
// Implementation IFSHook class
// FileName: IFSHook.cpp
// Copyright (c) 1997 by Somnath Kundu.  All Rights Reserved.

#define WANTVXDWRAPS
#include <vxdlib.h>
#pragma  hdrstop
#include "fcrypt.h"
#include "ifshook.h"

#pragma VxD_LOCKED_DATA_SEG
#pragma VxD_LOCKED_CODE_SEG

int IFSHook::CallPrevHook (IFSHookParams* pHookParams)
{
    int retVal = (**PrevHookFunc)( pHookParams->FSDFnAddr,
                   pHookParams->FunctionNum, pHookParams->Drive,
                   pHookParams->ResourceFlags, pHookParams->CodePage,
                   pHookParams->pir);
                                    
    return retVal;
}
  
BOOL IFSHook::HookIFS (pIFSFileHookFunc HookFunc)
{
    if (PrevHookFunc)
       return FALSE;

    if (HookFunc)
      CurHookFunc = HookFunc;

    pFileHandle = (FileHandleInfo *)_HeapAllocate( sizeof(FileHandleInfo)*50, HEAPZEROINIT);
    assert( pFileHandle);
    MaxFileHandle = 50;
    FileHandleNo = 0;

    if (CurHookFunc)
       PrevHookFunc = (ppIFSFileHookFunc)CVXDCALL2( IFSMgr_InstallFileSystemApiHook, CurHookFunc);

    return (PrevHookFunc != 0);
}

BOOL IFSHook::UnhookIFS ()
{
    if (PrevHookFunc
        && -1 != CVXDCALL2( IFSMgr_RemoveFileSystemApiHook, CurHookFunc))
    {
       PrevHookFunc = NULL;
       assert( FileHandleNo == 0);
       _HeapFree( pFileHandle, 0);
       return TRUE;
    }
    return FALSE;
}

int IFSHookParams::BCSPath (char* pPathBuff, int len, PathElement* pp_elements)
{
    int rlen;

    if ((BYTE)Drive != 0xff)            // not an UNC path
    {
       pPathBuff[0] = Drive + 'A' - 1;
       pPathBuff[1] = ':';
       rlen = 2;
    }
    else
       rlen = GetBCSFName( pPathBuff, len);
    len = CVXDCALL5( UniToBCSPath, (BYTE*)pPathBuff+rlen, pp_elements, len, CodePage);
    pPathBuff[len+rlen] = '\0';
    return (len+rlen);
}   

int IFSHookParams::GetBCSFName (char* pFNameBuff, int Len)
{
    DWORD ulen = 0;
    while (pir->ir_uFName[ulen])
        ++ulen;
    Len = CVXDCALL6( UniToBCS,(BYTE*)pFNameBuff,pir->ir_uFName,ulen*2,Len,CodePage);
    pFNameBuff[Len] = '\0';
    return Len;
}

int MoveFile (CSTR pExistingFile, CSTR pNewFile)
{
    int attr,f1,f2,n,ret=FALSE;
    STR buf;

   if ((attr = GetFileAttr( pExistingFile)) == -1)
      return ret;

   buf = (STR)CVXDCALL2( IFSMgr_GetHeap, PAGESIZE*2);
   assert( buf);
   if (!buf)
     return ret;

   if ((f1 = open( pExistingFile, ACCESS_READONLY | SHARE_DENYWRITE, ACTION_OPENEXISTING)) == -1)
      goto no_buf;

   if ((f2 = open( pNewFile, ACCESS_WRITEONLY, ACTION_CREATENEW)) == -1)
       goto close1;

   ret = TRUE;
   while ((n = read( f1, buf, PAGESIZE*2)) > 0)
       if (write( f2, buf, n) != n)
          ret = FALSE;

   close( f2);
   if (ret)                          // successfully copied
      SetFileAttr( pNewFile, attr);  // set original file attributes
   else                              // there is some error
      remove( pNewFile);             // delete it

 close1:
   close( f1);
   if (ret)                          // if successfully copied
   {
      SetFileAttr( pExistingFile, FILE_ATTRIBUTE_ARCHIVE);
      remove( pExistingFile);        // remove the original one
   }

 no_buf:
   CVXDCALL2( IFSMgr_RetHeap, buf);

   return ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -