You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
606 lines
16 KiB
606 lines
16 KiB
#include "stdafx.h"
|
|
#include "drmerr.h"
|
|
|
|
#define E_NoActiveSync HRESULT_FROM_WIN32(ERROR_DLL_NOT_FOUND)
|
|
#define WIN_ERR_NO_ACTIVE_SYNC ERROR_DLL_NOT_FOUND
|
|
|
|
#define RAPILIBNAME L"rapi.dll"
|
|
|
|
|
|
HRESULT CeRapiInitEx(RAPIINIT* pRapiInit)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef HRESULT (*PFN)(RAPIINIT *);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRapiInitEx");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(pRapiInit);
|
|
}
|
|
}
|
|
|
|
return E_NoActiveSync;
|
|
}
|
|
|
|
HRESULT CeRapiInvoke( LPCWSTR pDllPath, LPCWSTR pFunctionName, DWORD cbInput, BYTE *pInput,
|
|
DWORD *pcbOutput, BYTE **ppOutput, IRAPIStream **ppIRAPIStream, DWORD dwReserved )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef HRESULT (*PFN)(LPCWSTR, LPCWSTR, DWORD, BYTE*, DWORD*, BYTE**, IRAPIStream**, DWORD);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRapiInvoke");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(pDllPath, pFunctionName, cbInput, pInput, pcbOutput, ppOutput, ppIRAPIStream, dwReserved);
|
|
}
|
|
}
|
|
|
|
return E_NoActiveSync;
|
|
}
|
|
|
|
HRESULT CeRapiInit(void)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef HRESULT (*PFN)(void);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRapiInit");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)();
|
|
}
|
|
}
|
|
|
|
return E_NoActiveSync;
|
|
}
|
|
|
|
LONG CeRegOpenKeyEx( HKEY hKey, LPCWSTR lpszSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef LONG (*PFN)(HKEY , LPCWSTR , DWORD , REGSAM , PHKEY );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRegOpenKeyEx");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(hKey, lpszSubKey, ulOptions, samDesired, phkResult);
|
|
}
|
|
}
|
|
|
|
return WIN_ERR_NO_ACTIVE_SYNC;
|
|
}
|
|
|
|
HRESULT CeRapiGetError(void)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef HRESULT (*PFN)();
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRapiGetError");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)();
|
|
}
|
|
}
|
|
|
|
return E_NoActiveSync;
|
|
}
|
|
|
|
DWORD CeGetLastError( void )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef DWORD (*PFN)();
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeGetLastError");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)();
|
|
}
|
|
}
|
|
return WIN_ERR_NO_ACTIVE_SYNC;
|
|
}
|
|
|
|
BOOL CeGetSystemPowerStatusEx(PSYSTEM_POWER_STATUS_EX pstatus, BOOL fUpdate)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(PSYSTEM_POWER_STATUS_EX, BOOL);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeGetSystemPowerStatusEx");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(pstatus, fUpdate);
|
|
}
|
|
}
|
|
|
|
return FALSE; //FALSE indicates error
|
|
}
|
|
|
|
HRESULT CeRapiFreeBuffer( LPVOID Buffer )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef HRESULT (*PFN)(LPVOID);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRapiFreeBuffer");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(Buffer);
|
|
}
|
|
}
|
|
|
|
return E_NoActiveSync;
|
|
}
|
|
|
|
BOOL CeFindAllFiles(LPCWSTR szPath, DWORD dwFlags, LPDWORD lpdwFoundCount, LPLPCE_FIND_DATA ppFindDataArray)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(LPCWSTR, DWORD, LPDWORD, LPLPCE_FIND_DATA);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeFindAllFiles");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(szPath, dwFlags, lpdwFoundCount, ppFindDataArray);
|
|
}
|
|
}
|
|
|
|
return FALSE; //FALSE indicates error
|
|
}
|
|
|
|
BOOL CeCreateDirectory(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(LPCWSTR, LPSECURITY_ATTRIBUTES);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeCreateDirectory");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpPathName, lpSecurityAttributes);
|
|
}
|
|
}
|
|
|
|
return FALSE; //FALSE indicates error
|
|
}
|
|
|
|
BOOL CeCloseHandle( HANDLE hObject )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(HANDLE);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeCloseHandle");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(hObject);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CeSetFileAttributes(LPCWSTR lpFileName, DWORD dwFileAttributes)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(LPCWSTR, DWORD);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeSetFileAttributes");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpFileName, dwFileAttributes);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
LONG CeRegQueryValueEx( HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef LONG (*PFN)( HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRegQueryValueEx");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData);
|
|
}
|
|
}
|
|
|
|
return WIN_ERR_NO_ACTIVE_SYNC;
|
|
}
|
|
|
|
LONG CeRegCloseKey( HKEY hKey )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef LONG (*PFN)( HKEY );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRegCloseKey");
|
|
|
|
_Assert (pfn != NULL); //there is no reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(hKey);
|
|
}
|
|
}
|
|
|
|
return WIN_ERR_NO_ACTIVE_SYNC;
|
|
}
|
|
|
|
HRESULT CeRapiUninit(void)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef HRESULT (*PFN)();
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRapiUninit");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)();
|
|
}
|
|
}
|
|
|
|
return E_NoActiveSync;
|
|
}
|
|
|
|
BOOL CeRemoveDirectory(LPCWSTR lpPathName)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(LPCWSTR);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeRemoveDirectory");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpPathName);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CeMoveFile(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(LPCWSTR, LPCWSTR);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeMoveFile");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpExistingFileName, lpNewFileName);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
DWORD CeSetFilePointer( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef DWORD (*PFN)( HANDLE, LONG, PLONG , DWORD );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeSetFilePointer");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
|
|
}
|
|
}
|
|
|
|
//dll not found, fail over
|
|
if (NULL != lpDistanceToMoveHigh)
|
|
{
|
|
*lpDistanceToMoveHigh = NULL;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
BOOL CeDeleteFile(LPCWSTR lpFileName)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)( LPCWSTR );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeDeleteFile");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpFileName);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CeWriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
|
|
LPOVERLAPPED lpOverlapped )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)( HANDLE , LPCVOID , DWORD , LPDWORD , LPOVERLAPPED );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeWriteFile");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CeReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead,
|
|
LPOVERLAPPED lpOverlapped )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)( HANDLE , LPVOID , DWORD , LPDWORD , LPOVERLAPPED );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeReadFile");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
DWORD CeGetFileAttributes(LPCWSTR lpFileName)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef DWORD (*PFN)( LPCWSTR );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeGetFileAttributes");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpFileName);
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
BOOL CeSHGetShortcutTarget(LPWSTR lpszShortcut, LPWSTR lpszTarget, int cbMax)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)( LPWSTR , LPWSTR , int );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeSHGetShortcutTarget");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpszShortcut, lpszTarget, cbMax);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CeCreateProcess(LPCWSTR lpApplicationName, LPCWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
|
BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPWSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(LPCWSTR , LPCWSTR , LPSECURITY_ATTRIBUTES , LPSECURITY_ATTRIBUTES ,
|
|
BOOL , DWORD , LPVOID , LPWSTR , LPSTARTUPINFO , LPPROCESS_INFORMATION );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeCreateProcess");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment,
|
|
lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
HANDLE CeCreateFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef HANDLE (*PFN)(LPCWSTR , DWORD , DWORD , LPSECURITY_ATTRIBUTES , DWORD , DWORD , HANDLE );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeCreateFile");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
|
}
|
|
}
|
|
|
|
return INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
HANDLE CeFindFirstFile(LPCWSTR lpFileName, LPCE_FIND_DATA lpFindFileData)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef HANDLE (*PFN)(LPCWSTR , LPCE_FIND_DATA );
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeFindFirstFile");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpFileName, lpFindFileData);
|
|
}
|
|
}
|
|
|
|
return INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
BOOL CeGetVersionEx(LPCEOSVERSIONINFO lpVersionInformation)
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(LPCEOSVERSIONINFO);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeGetVersionEx");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(lpVersionInformation);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CeFindClose( HANDLE hFindFile )
|
|
{
|
|
HMODULE hMod = LoadLibrary (RAPILIBNAME);
|
|
|
|
if (hMod != NULL)
|
|
{
|
|
typedef BOOL (*PFN)(HANDLE);
|
|
|
|
PFN pfn = (PFN) GetProcAddress(hMod, "CeFindClose");
|
|
|
|
_Assert (pfn != NULL); //there is no good reason that this fn wd not be there, it probably means a bug in late binding
|
|
|
|
if (pfn != NULL)
|
|
{
|
|
return (*pfn)(hFindFile);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|