例如,我安装了Win 98 DDK,在DDK文档中有一个IFSMgr_InstallFileSystemApiHook函数,那么如何在Delphi中进行调用?
我的DDK是2K的,不知道有没有这个函数。现在事情比较多,大致说一下吧。
根据.h或者.inc文件找到函数对应的Lib文件。如果,确定不了,就在所有的Lib文件里面搜索吧^_^
找到后,用二进制编辑器打开文件。开头应该是:!<arch>
在文件中部会发现如下定义:
__imp__ZwEnumerateValueKey@24。__IMPORT_DESCRIPTOR_NTOSKRNL..NTOSKRNL.EXE
就是说EnumerateValueKey在NTOSKRNL.exe中,id是24,真实名字是:__imp__ZwEnumerateValueKey。
我明白了。这个函数并不是独立的函数。而是类似于以前中断调用的一个功能,要通过VxDCall调用来实现(DDK在VMM.inc中定义)。
VxDCall(IFSMgr_InstallFileSystemApiHook);
所以应该这样:
int IFSMgrInstallFileSystemApiHook(pIFSFileHookFunc HookFunc)
{
int iResult;
_asm mov eax [HookFunc]
VxDCall(IFSMgr_InstallFileSystemApiHook);
_asm mov [iResult], eax
return(iResult);
}
GoodHope(好望角)
我只是大意示范一下,C++里面的内嵌汇编已经忘记该怎么写了。
*************
气死我了!!!!
我说怎么老编译不过去,原来是把警告当成错误了!看着编译输出窗口一阵乱滚,心也乱了,竟然没有注意到是只是警告。真真气死我了!!!!
代码见下,可实现你的调用要求。IFSMgr_InstallFileSystemApiHook函数体内部汇编未经调试,纯属虚构。
编译警告可以通过在每个IFSMgr_Service定义体内增加一个参数(第二个)LOCAL来消除,不过拿不准是否应该添加。
#include <VMM.h>
#ifndef IFSMGR_DEVICE_ID
#define IFSMGR_DEVICE_ID 0x00040 /* Installable File System Manager */
#define IFSMGR_INIT_ORDER 0x10000 + V86MMGR_Init_Order
#define FSD_INIT_ORDER 0x00100 + IFSMgr_Init_Order
#else
/* ASM
ifdef MASM
.errnz IFSMgr_Device_ID - 0040h
endif
*/
#endif
#define IFSMgr_Service Declare_Service
#define IFSMgr_StdCall_Service Declare_SCService
#define IFSMgr_FastCall_Service Declare_SCService
Begin_Service_Table(IFSMGR, IFSMGR)
IFSMgr_Service (IFSMgr_Get_Version)
IFSMgr_Service (IFSMgr_RegisterMount)
IFSMgr_Service (IFSMgr_RegisterNet)
IFSMgr_Service (IFSMgr_RegisterMailSlot)
IFSMgr_Service (IFSMgr_Attach)
IFSMgr_Service (IFSMgr_Detach)
IFSMgr_Service (IFSMgr_Get_NetTime)
IFSMgr_Service (IFSMgr_Get_DOSTime)
IFSMgr_Service (IFSMgr_SetupConnection)
IFSMgr_Service (IFSMgr_DerefConnection)
IFSMgr_Service (IFSMgr_ServerDOSCall)
IFSMgr_Service (IFSMgr_CompleteAsync)
IFSMgr_Service (IFSMgr_RegisterHeap)
IFSMgr_Service (IFSMgr_GetHeap)
IFSMgr_Service (IFSMgr_RetHeap)
IFSMgr_Service (IFSMgr_CheckHeap)
IFSMgr_Service (IFSMgr_CheckHeapItem)
IFSMgr_Service (IFSMgr_FillHeapSpare)
IFSMgr_Service (IFSMgr_Block)
IFSMgr_Service (IFSMgr_Wakeup)
IFSMgr_Service (IFSMgr_Yield)
IFSMgr_Service (IFSMgr_SchedEvent)
IFSMgr_Service (IFSMgr_QueueEvent)
IFSMgr_Service (IFSMgr_KillEvent)
IFSMgr_Service (IFSMgr_FreeIOReq)
IFSMgr_Service (IFSMgr_MakeMailSlot)
IFSMgr_Service (IFSMgr_DeleteMailSlot)
IFSMgr_Service (IFSMgr_WriteMailSlot)
IFSMgr_Service (IFSMgr_PopUp)
IFSMgr_Service (IFSMgr_printf)
IFSMgr_Service (IFSMgr_AssertFailed)
IFSMgr_Service (IFSMgr_LogEntry)
IFSMgr_Service (IFSMgr_DebugMenu)
IFSMgr_Service (IFSMgr_DebugVars)
IFSMgr_Service (IFSMgr_GetDebugString)
IFSMgr_Service (IFSMgr_GetDebugHexNum)
IFSMgr_Service (IFSMgr_NetFunction)
IFSMgr_Service (IFSMgr_DoDelAllUses)
IFSMgr_Service (IFSMgr_SetErrString)
IFSMgr_Service (IFSMgr_GetErrString)
IFSMgr_Service (IFSMgr_SetReqHook)
IFSMgr_Service (IFSMgr_SetPathHook)
IFSMgr_Service (IFSMgr_UseAdd)
IFSMgr_Service (IFSMgr_UseDel)
IFSMgr_Service (IFSMgr_InitUseAdd)
IFSMgr_Service (IFSMgr_ChangeDir)
IFSMgr_Service (IFSMgr_DelAllUses)
IFSMgr_Service (IFSMgr_CDROM_Attach)
IFSMgr_Service (IFSMgr_CDROM_Detach)
IFSMgr_Service (IFSMgr_Win32DupHandle)
IFSMgr_Service (IFSMgr_Ring0_FileIO)
IFSMgr_Service (IFSMgr_Win32_Get_Ring0_Handle)
IFSMgr_Service (IFSMgr_Get_Drive_Info)
IFSMgr_Service (IFSMgr_Ring0GetDriveInfo)
IFSMgr_Service (IFSMgr_BlockNoEvents)
IFSMgr_Service (IFSMgr_NetToDosTime)
IFSMgr_Service (IFSMgr_DosToNetTime)
IFSMgr_Service (IFSMgr_DosToWin32Time)
IFSMgr_Service (IFSMgr_Win32ToDosTime)
IFSMgr_Service (IFSMgr_NetToWin32Time)
IFSMgr_Service (IFSMgr_Win32ToNetTime)
IFSMgr_Service (IFSMgr_MetaMatch)
IFSMgr_Service (IFSMgr_TransMatch)
IFSMgr_Service (IFSMgr_CallProvider)
IFSMgr_Service (UniToBCS)
IFSMgr_Service (UniToBCSPath)
IFSMgr_Service (BCSToUni)
IFSMgr_Service (UniToUpper)
IFSMgr_Service (UniCharToOEM)
IFSMgr_Service (CreateBasis)
IFSMgr_Service (MatchBasisName)
IFSMgr_Service (AppendBasisTail)
IFSMgr_Service (FcbToShort)
IFSMgr_Service (ShortToFcb)
IFSMgr_Service (IFSMgr_ParsePath)
IFSMgr_Service (Query_PhysLock)
IFSMgr_Service (_VolFlush)
IFSMgr_Service (NotifyVolumeArrival)
IFSMgr_Service (NotifyVolumeRemoval)
IFSMgr_Service (QueryVolumeRemoval)
IFSMgr_Service (IFSMgr_FSDUnmountCFSD)
IFSMgr_Service (IFSMgr_GetConversionTablePtrs)
IFSMgr_Service (IFSMgr_CheckAccessConflict)
IFSMgr_Service (IFSMgr_LockFile)
IFSMgr_Service (IFSMgr_UnlockFile)
IFSMgr_Service (IFSMgr_RemoveLocks)
IFSMgr_Service (IFSMgr_CheckLocks)
IFSMgr_Service (IFSMgr_CountLocks)
IFSMgr_Service (IFSMgr_ReassignLockFileInst)
IFSMgr_Service (IFSMgr_UnassignLockList)
IFSMgr_Service (IFSMgr_MountChildVolume)
IFSMgr_Service (IFSMgr_UnmountChildVolume)
IFSMgr_Service (IFSMgr_SwapDrives)
IFSMgr_Service (IFSMgr_FSDMapFHtoIOREQ)
IFSMgr_Service (IFSMgr_FSDParsePath)
IFSMgr_Service (IFSMgr_FSDAttachSFT)
IFSMgr_Service (IFSMgr_GetTimeZoneBias)
IFSMgr_Service (IFSMgr_PNPEvent)
IFSMgr_Service (IFSMgr_RegisterCFSD)
IFSMgr_Service (IFSMgr_Win32MapExtendedHandleToSFT)
IFSMgr_Service (IFSMgr_DbgSetFileHandleLimit)
IFSMgr_Service (IFSMgr_Win32MapSFTToExtendedHandle)
IFSMgr_Service (IFSMgr_FSDGetCurrentDrive)
IFSMgr_Service (IFSMgr_InstallFileSystemApiHook)
IFSMgr_Service (IFSMgr_RemoveFileSystemApiHook)
IFSMgr_Service (IFSMgr_RunScheduledEvents)
IFSMgr_Service (IFSMgr_CheckDelResource)
IFSMgr_Service (IFSMgr_Win32GetVMCurdir)
IFSMgr_Service (IFSMgr_SetupFailedConnection)
IFSMgr_Service (_GetMappedErr)
IFSMgr_Service (ShortToLossyFcb)
IFSMgr_Service (IFSMgr_GetLockState)
IFSMgr_Service (BcsToBcs)
IFSMgr_Service (IFSMgr_SetLoopback)
IFSMgr_Service (IFSMgr_ClearLoopback)
IFSMgr_Service (IFSMgr_ParseOneElement)
IFSMgr_Service (BcsToBcsUpper)
IFSMgr_Service (IFSMgr_DeregisterFSD)
IFSMgr_Service (IFSMgr_RegisterFSDWithPriority)
IFSMgr_Service (IFSMgr_Get_DOSTimeRounded)
IFSMgr_Service (_LongToFcbOem)
IFSMgr_Service (IFSMgr_GetRing0FileHandle)
IFSMgr_Service (IFSMgr_UpdateTimezoneInfo)
IFSMgr_Service (IFSMgr_Ring0IsCPSingleByte)
End_Service_Table(IFSMGR, IFSMGR)
// 这个函数是根据MSDN给出的IFSMgr_InstallFileSystemApiHook的入口和出口参数写的
// 除了那两句_asm语句,别的都应该没有什么问题。
int VXDINLINE
IFSMgr_InstallFileSystemApiHook(int HookFunc)
{
int iResult;
_asm mov eax, [HookFunc] // 也许应该是_asm mov edx, [HookFunc]
VxDCall (IFSMgr_InstallFileSystemApiHook)
_asm mov [iResult], eax
return(iResult);
}