Return-Path: X-Original-To: apmail-hadoop-common-commits-archive@www.apache.org Delivered-To: apmail-hadoop-common-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 28EE310E18 for ; Sun, 11 Aug 2013 06:17:27 +0000 (UTC) Received: (qmail 15362 invoked by uid 500); 11 Aug 2013 06:17:25 -0000 Delivered-To: apmail-hadoop-common-commits-archive@hadoop.apache.org Received: (qmail 15244 invoked by uid 500); 11 Aug 2013 06:17:24 -0000 Mailing-List: contact common-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: common-dev@hadoop.apache.org Delivered-To: mailing list common-commits@hadoop.apache.org Received: (qmail 15224 invoked by uid 99); 11 Aug 2013 06:17:23 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 11 Aug 2013 06:17:23 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 11 Aug 2013 06:17:20 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 9CF9623888E7; Sun, 11 Aug 2013 06:17:00 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1512875 - in /hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common: ./ src/main/native/ src/main/native/src/org/apache/hadoop/io/compress/snappy/ src/main/native/src/org/apache/hadoop/util/ src/main/winutils/ src/main... Date: Sun, 11 Aug 2013 06:17:00 -0000 To: common-commits@hadoop.apache.org From: cnauroth@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20130811061700.9CF9623888E7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: cnauroth Date: Sun Aug 11 06:16:59 2013 New Revision: 1512875 URL: http://svn.apache.org/r1512875 Log: HADOOP-9802. Merging change r1512874 from branch-2 to branch-2.1-beta. Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/CHANGES.txt hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/pom.xml hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/native.vcxproj hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyCompressor.c hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyDecompressor.c hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/org_apache_hadoop_io_compress_snappy.h hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/util/NativeCodeLoader.c hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/include/winutils.h hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/libwinutils.c Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/CHANGES.txt (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/CHANGES.txt Sun Aug 11 06:16:59 2013 @@ -24,6 +24,8 @@ Release 2.1.1-beta - UNRELEASED HADOOP-8814. Replace string equals "" by String#isEmpty(). (Brandon Li via suresh) + HADOOP-9802. Support Snappy codec on Windows. (cnauroth) + OPTIMIZATIONS BUG FIXES Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/pom.xml URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/pom.xml?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/pom.xml (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/pom.xml Sun Aug 11 06:16:59 2013 @@ -587,6 +587,13 @@ Windows + + + + + false + true + @@ -671,6 +678,10 @@ /nologo /p:Configuration=Release /p:OutDir=${project.build.directory}/bin/ + /p:CustomSnappyPrefix=${snappy.prefix} + /p:CustomSnappyLib=${snappy.lib} + /p:CustomSnappyInclude=${snappy.include} + /p:RequireSnappy=${require.snappy} Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/native.vcxproj URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/native.vcxproj?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/native.vcxproj (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/native.vcxproj Sun Aug 11 06:16:59 2013 @@ -17,7 +17,7 @@ limitations under the License. --> - + Release @@ -49,6 +49,21 @@ ..\..\..\target\native\$(Configuration)\ hadoop + + $(CustomSnappyPrefix) + $(CustomSnappyPrefix)\lib + $(CustomSnappyLib) + $(CustomSnappyPrefix) + $(CustomSnappyPrefix)\include + $(CustomSnappyInclude) + true + $(SnappyInclude);$(IncludePath) + + + + Level3 @@ -71,6 +86,12 @@ + + /D HADOOP_SNAPPY_LIBRARY=L\"snappy.dll\" + + + /D HADOOP_SNAPPY_LIBRARY=L\"snappy.dll\" + @@ -78,12 +99,15 @@ - + + /D HADOOP_SNAPPY_LIBRARY=L\"snappy.dll\" + + Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyCompressor.c URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyCompressor.c?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyCompressor.c (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyCompressor.c Sun Aug 11 06:16:59 2013 @@ -30,6 +30,10 @@ #include "config.h" #endif // UNIX +#ifdef WINDOWS +#include "winutils.h" +#endif + #include "org_apache_hadoop_io_compress_snappy_SnappyCompressor.h" #define JINT_MAX 0x7fffffff @@ -40,11 +44,18 @@ static jfieldID SnappyCompressor_uncompr static jfieldID SnappyCompressor_compressedDirectBuf; static jfieldID SnappyCompressor_directBufferSize; +#ifdef UNIX static snappy_status (*dlsym_snappy_compress)(const char*, size_t, char*, size_t*); +#endif + +#ifdef WINDOWS +typedef snappy_status (__cdecl *__dlsym_snappy_compress)(const char*, size_t, char*, size_t*); +static __dlsym_snappy_compress dlsym_snappy_compress; +#endif JNIEXPORT void JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompressor_initIDs (JNIEnv *env, jclass clazz){ - +#ifdef UNIX // Load libsnappy.so void *libsnappy = dlopen(HADOOP_SNAPPY_LIBRARY, RTLD_LAZY | RTLD_GLOBAL); if (!libsnappy) { @@ -53,10 +64,25 @@ JNIEXPORT void JNICALL Java_org_apache_h THROW(env, "java/lang/UnsatisfiedLinkError", msg); return; } +#endif + +#ifdef WINDOWS + HMODULE libsnappy = LoadLibrary(HADOOP_SNAPPY_LIBRARY); + if (!libsnappy) { + THROW(env, "java/lang/UnsatisfiedLinkError", "Cannot load snappy.dll"); + return; + } +#endif // Locate the requisite symbols from libsnappy.so +#ifdef UNIX dlerror(); // Clear any existing error LOAD_DYNAMIC_SYMBOL(dlsym_snappy_compress, env, libsnappy, "snappy_compress"); +#endif + +#ifdef WINDOWS + LOAD_DYNAMIC_SYMBOL(__dlsym_snappy_compress, dlsym_snappy_compress, env, libsnappy, "snappy_compress"); +#endif SnappyCompressor_clazz = (*env)->GetStaticFieldID(env, clazz, "clazz", "Ljava/lang/Class;"); @@ -74,6 +100,9 @@ JNIEXPORT void JNICALL Java_org_apache_h JNIEXPORT jint JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompressor_compressBytesDirect (JNIEnv *env, jobject thisj){ + const char* uncompressed_bytes; + char* compressed_bytes; + snappy_status ret; // Get members of SnappyCompressor jobject clazz = (*env)->GetStaticObjectField(env, thisj, SnappyCompressor_clazz); jobject uncompressed_direct_buf = (*env)->GetObjectField(env, thisj, SnappyCompressor_uncompressedDirectBuf); @@ -84,7 +113,7 @@ JNIEXPORT jint JNICALL Java_org_apache_h // Get the input direct buffer LOCK_CLASS(env, clazz, "SnappyCompressor"); - const char* uncompressed_bytes = (const char*)(*env)->GetDirectBufferAddress(env, uncompressed_direct_buf); + uncompressed_bytes = (const char*)(*env)->GetDirectBufferAddress(env, uncompressed_direct_buf); UNLOCK_CLASS(env, clazz, "SnappyCompressor"); if (uncompressed_bytes == 0) { @@ -93,7 +122,7 @@ JNIEXPORT jint JNICALL Java_org_apache_h // Get the output direct buffer LOCK_CLASS(env, clazz, "SnappyCompressor"); - char* compressed_bytes = (char *)(*env)->GetDirectBufferAddress(env, compressed_direct_buf); + compressed_bytes = (char *)(*env)->GetDirectBufferAddress(env, compressed_direct_buf); UNLOCK_CLASS(env, clazz, "SnappyCompressor"); if (compressed_bytes == 0) { @@ -102,8 +131,8 @@ JNIEXPORT jint JNICALL Java_org_apache_h /* size_t should always be 4 bytes or larger. */ buf_len = (size_t)compressed_direct_buf_len; - snappy_status ret = dlsym_snappy_compress(uncompressed_bytes, - uncompressed_direct_buf_len, compressed_bytes, &buf_len); + ret = dlsym_snappy_compress(uncompressed_bytes, uncompressed_direct_buf_len, + compressed_bytes, &buf_len); if (ret != SNAPPY_OK){ THROW(env, "Ljava/lang/InternalError", "Could not compress data. Buffer length is too small."); return 0; @@ -128,8 +157,18 @@ Java_org_apache_hadoop_io_compress_snapp return (*env)->NewStringUTF(env, dl_info.dli_fname); } } -#endif + return (*env)->NewStringUTF(env, HADOOP_SNAPPY_LIBRARY); -} +#endif +#ifdef WINDOWS + LPWSTR filename = NULL; + GetLibraryName(dlsym_snappy_compress, &filename); + if (filename != NULL) { + return (*env)->NewString(env, filename, (jsize) wcslen(filename)); + } else { + return (*env)->NewStringUTF(env, "Unavailable"); + } +#endif +} #endif //define HADOOP_SNAPPY_LIBRARY Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyDecompressor.c URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyDecompressor.c?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyDecompressor.c (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/SnappyDecompressor.c Sun Aug 11 06:16:59 2013 @@ -37,12 +37,20 @@ static jfieldID SnappyDecompressor_compr static jfieldID SnappyDecompressor_uncompressedDirectBuf; static jfieldID SnappyDecompressor_directBufferSize; +#ifdef UNIX static snappy_status (*dlsym_snappy_uncompress)(const char*, size_t, char*, size_t*); +#endif + +#ifdef WINDOWS +typedef snappy_status (__cdecl *__dlsym_snappy_uncompress)(const char*, size_t, char*, size_t*); +static __dlsym_snappy_uncompress dlsym_snappy_uncompress; +#endif JNIEXPORT void JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyDecompressor_initIDs (JNIEnv *env, jclass clazz){ // Load libsnappy.so +#ifdef UNIX void *libsnappy = dlopen(HADOOP_SNAPPY_LIBRARY, RTLD_LAZY | RTLD_GLOBAL); if (!libsnappy) { char* msg = (char*)malloc(1000); @@ -50,11 +58,27 @@ JNIEXPORT void JNICALL Java_org_apache_h THROW(env, "java/lang/UnsatisfiedLinkError", msg); return; } +#endif + +#ifdef WINDOWS + HMODULE libsnappy = LoadLibrary(HADOOP_SNAPPY_LIBRARY); + if (!libsnappy) { + THROW(env, "java/lang/UnsatisfiedLinkError", "Cannot load snappy.dll"); + return; + } +#endif // Locate the requisite symbols from libsnappy.so +#ifdef UNIX dlerror(); // Clear any existing error LOAD_DYNAMIC_SYMBOL(dlsym_snappy_uncompress, env, libsnappy, "snappy_uncompress"); +#endif + +#ifdef WINDOWS + LOAD_DYNAMIC_SYMBOL(__dlsym_snappy_uncompress, dlsym_snappy_uncompress, env, libsnappy, "snappy_uncompress"); +#endif + SnappyDecompressor_clazz = (*env)->GetStaticFieldID(env, clazz, "clazz", "Ljava/lang/Class;"); SnappyDecompressor_compressedDirectBuf = (*env)->GetFieldID(env,clazz, @@ -71,6 +95,9 @@ JNIEXPORT void JNICALL Java_org_apache_h JNIEXPORT jint JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyDecompressor_decompressBytesDirect (JNIEnv *env, jobject thisj){ + const char* compressed_bytes = NULL; + char* uncompressed_bytes = NULL; + snappy_status ret; // Get members of SnappyDecompressor jobject clazz = (*env)->GetStaticObjectField(env,thisj, SnappyDecompressor_clazz); jobject compressed_direct_buf = (*env)->GetObjectField(env,thisj, SnappyDecompressor_compressedDirectBuf); @@ -80,7 +107,7 @@ JNIEXPORT jint JNICALL Java_org_apache_h // Get the input direct buffer LOCK_CLASS(env, clazz, "SnappyDecompressor"); - const char* compressed_bytes = (const char*)(*env)->GetDirectBufferAddress(env, compressed_direct_buf); + compressed_bytes = (const char*)(*env)->GetDirectBufferAddress(env, compressed_direct_buf); UNLOCK_CLASS(env, clazz, "SnappyDecompressor"); if (compressed_bytes == 0) { @@ -89,14 +116,15 @@ JNIEXPORT jint JNICALL Java_org_apache_h // Get the output direct buffer LOCK_CLASS(env, clazz, "SnappyDecompressor"); - char* uncompressed_bytes = (char *)(*env)->GetDirectBufferAddress(env, uncompressed_direct_buf); + uncompressed_bytes = (char *)(*env)->GetDirectBufferAddress(env, uncompressed_direct_buf); UNLOCK_CLASS(env, clazz, "SnappyDecompressor"); if (uncompressed_bytes == 0) { return (jint)0; } - snappy_status ret = dlsym_snappy_uncompress(compressed_bytes, compressed_direct_buf_len, uncompressed_bytes, &uncompressed_direct_buf_len); + ret = dlsym_snappy_uncompress(compressed_bytes, compressed_direct_buf_len, + uncompressed_bytes, &uncompressed_direct_buf_len); if (ret == SNAPPY_BUFFER_TOO_SMALL){ THROW(env, "Ljava/lang/InternalError", "Could not decompress data. Buffer length is too small."); } else if (ret == SNAPPY_INVALID_INPUT){ Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/org_apache_hadoop_io_compress_snappy.h URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/org_apache_hadoop_io_compress_snappy.h?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/org_apache_hadoop_io_compress_snappy.h (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/io/compress/snappy/org_apache_hadoop_io_compress_snappy.h Sun Aug 11 06:16:59 2013 @@ -21,7 +21,11 @@ #define ORG_APACHE_HADOOP_IO_COMPRESS_SNAPPY_SNAPPY_H #include "org_apache_hadoop.h" + +#ifdef UNIX #include +#endif + #include #include #include Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/util/NativeCodeLoader.c URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/util/NativeCodeLoader.c?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/util/NativeCodeLoader.c (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/native/src/org/apache/hadoop/util/NativeCodeLoader.c Sun Aug 11 06:16:59 2013 @@ -23,6 +23,10 @@ #include "config.h" #endif // UNIX +#ifdef WINDOWS +#include "winutils.h" +#endif + #include JNIEXPORT jboolean JNICALL Java_org_apache_hadoop_util_NativeCodeLoader_buildSupportsSnappy @@ -47,32 +51,16 @@ JNIEXPORT jstring JNICALL Java_org_apach #endif #ifdef WINDOWS - SIZE_T ret = 0; - DWORD size = MAX_PATH; LPWSTR filename = NULL; - HMODULE mod = NULL; - DWORD err = ERROR_SUCCESS; - - MEMORY_BASIC_INFORMATION mbi; - ret = VirtualQuery(Java_org_apache_hadoop_util_NativeCodeLoader_getLibraryName, - &mbi, sizeof(mbi)); - if (ret == 0) goto cleanup; - mod = mbi.AllocationBase; - - do { - filename = (LPWSTR) realloc(filename, size * sizeof(WCHAR)); - if (filename == NULL) goto cleanup; - GetModuleFileName(mod, filename, size); - size <<= 1; - err = GetLastError(); - } while (err == ERROR_INSUFFICIENT_BUFFER); - - if (err != ERROR_SUCCESS) goto cleanup; - - return (*env)->NewString(env, filename, (jsize) wcslen(filename)); - -cleanup: - if (filename != NULL) free(filename); - return (*env)->NewStringUTF(env, "Unavailable"); + GetLibraryName(Java_org_apache_hadoop_util_NativeCodeLoader_getLibraryName, + &filename); + if (filename != NULL) + { + return (*env)->NewString(env, filename, (jsize) wcslen(filename)); + } + else + { + return (*env)->NewStringUTF(env, "Unavailable"); + } #endif } Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/include/winutils.h URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/include/winutils.h?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/include/winutils.h (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/include/winutils.h Sun Aug 11 06:16:59 2013 @@ -153,4 +153,6 @@ DWORD ChangeFileModeByMask(__in LPCWSTR DWORD GetLocalGroupsForUser(__in LPCWSTR user, __out LPLOCALGROUP_USERS_INFO_0 *groups, __out LPDWORD entries); -BOOL EnablePrivilege(__in LPCWSTR privilegeName); \ No newline at end of file +BOOL EnablePrivilege(__in LPCWSTR privilegeName); + +void GetLibraryName(__in LPCVOID lpAddress, __out LPWSTR *filename); Modified: hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/libwinutils.c URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/libwinutils.c?rev=1512875&r1=1512874&r2=1512875&view=diff ============================================================================== --- hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/libwinutils.c (original) +++ hadoop/common/branches/branch-2.1-beta/hadoop-common-project/hadoop-common/src/main/winutils/libwinutils.c Sun Aug 11 06:16:59 2013 @@ -1709,3 +1709,51 @@ void ReportErrorCode(LPCWSTR func, DWORD } if (msg != NULL) LocalFree(msg); } + +//---------------------------------------------------------------------------- +// Function: GetLibraryName +// +// Description: +// Given an address, get the file name of the library from which it was loaded. +// +// Returns: +// None +// +// Notes: +// - The function allocates heap memory and points the filename out parameter to +// the newly allocated memory, which will contain the name of the file. +// +// - If there is any failure, then the function frees the heap memory it +// allocated and sets the filename out parameter to NULL. +// +void GetLibraryName(LPCVOID lpAddress, LPWSTR *filename) +{ + SIZE_T ret = 0; + DWORD size = MAX_PATH; + HMODULE mod = NULL; + DWORD err = ERROR_SUCCESS; + + MEMORY_BASIC_INFORMATION mbi; + ret = VirtualQuery(lpAddress, &mbi, sizeof(mbi)); + if (ret == 0) goto cleanup; + mod = mbi.AllocationBase; + + do { + *filename = (LPWSTR) realloc(*filename, size * sizeof(WCHAR)); + if (*filename == NULL) goto cleanup; + GetModuleFileName(mod, *filename, size); + size <<= 1; + err = GetLastError(); + } while (err == ERROR_INSUFFICIENT_BUFFER); + + if (err != ERROR_SUCCESS) goto cleanup; + + return; + +cleanup: + if (*filename != NULL) + { + free(*filename); + *filename = NULL; + } +}