VOID vFreeUFIHashTable( PUFIHASH *ppHashTable ) { PUFIHASH pBucket, *ppHashEnd, pBucketTmp, *ppTableBase; if( ppHashTable == NULL ) { return; } ppTableBase = ppHashTable; // save ptr to the base so we can free it later // Next loop through the whole table looking for buckets lists for( ppHashEnd = ppHashTable + UFI_HASH_SIZE; ppHashTable < ppHashEnd; ppHashTable += 1 ) { pBucket = *ppHashTable; while( pBucket != NULL ) { pBucketTmp = pBucket; pBucket = pBucket->pNext; LOCALFREE( pBucketTmp ); } } LOCALFREE( ppTableBase ); }
/* A function called through the vtable when this loader is no longer needed by the application. */ static int vl_exit (lt_user_data LT__UNUSED loader_data) { vtable = NULL; LOCALFREE (error_message); return 0; }
/* Return the windows error message, or the passed in error message on failure. */ static const char * loadlibraryerror (const char *default_errmsg) { size_t len; LOCALFREE (error_message); FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError (), 0, (char *) &error_message, 0, NULL); /* Remove trailing CRNL */ len = LT_STRLEN (error_message); if (len && error_message[len - 1] == '\n') error_message[--len] = LT_EOS_CHAR; if (len && error_message[len - 1] == '\r') error_message[--len] = LT_EOS_CHAR; return len ? error_message : default_errmsg; }
BOOL bGetANSISetMap() { CHAR ch[256]; ULONG *pul; ULONG ii,jj; NTSTATUS st; ULONG cjResult; WCHAR *pwc; WCHAR *pwcSBC; // See if we know the answers already. (The client should not have called!) if (gpwcANSICharSet != (WCHAR *) NULL) return(TRUE); // Create a mapping. // Make an ANSI source char set. This funny way of initialization takes // about 180 instructions to execute rather than over 1000. pul = (ULONG *) ch; for (ii=0x03020100L,jj=0; jj<64; jj+=4) { pul[jj+0] = ii; ii += 0x04040404L; pul[jj+1] = ii; ii += 0x04040404L; pul[jj+2] = ii; ii += 0x04040404L; pul[jj+3] = ii; ii += 0x04040404L; } // Allocate the UNICODE buffer but don't write the pointer in until the // table is valid, in case we're racing another thread. pwc = LOCALALLOC(512 * sizeof(WCHAR)); pwcSBC = &pwc[256]; if (pwc == (WCHAR *) NULL) return(FALSE); // Convert the characters. pwc[0] = 0; st = RtlMultiByteToUnicodeN ( &pwc[1], // OUT PWCH UnicodeString 255 * sizeof(WCHAR), // IN ULONG MaxBytesInUnicodeString &cjResult, // OUT PULONG BytesInUnicodeString &ch[1], // IN PCH MultiByteString 255 // IN ULONG BytesInMultiByteString ); if( !NT_SUCCESS(st) ) { // Clean up and forget about accelerations. WARNING("GDI32: RtlMultiByteToUnicodeN error."); LOCALFREE(pwc); return(FALSE); } if( cjResult != 255 * sizeof(WCHAR) ) { // There must be a DBCS code page so gpwcANSIMap takes on new meaning. // It is used for fonts with ANSI,OEM, and SYMBOL charsets. Also, // another table, gpwcDBCS is constructed that is used to map the SBCS // of SHIFT-JIS fonts. WARNING("GDI32:Assuming DBCS code page.\n"); st = MultiByteToWideChar ( 1252, // code page to use 0, // flags &ch[1], // characters to translate 255, // number of multibyte characters &pwc[1], // unicode values of characters 255 // number of wide characters ); if( !NT_SUCCESS(st) ) { // Clean up and forget about accelerations. WARNING("GDI32: MultiByteToWideChar error."); LOCALFREE(pwc); return(FALSE); } // Okay now make a table for SBC bytes. Mark DBCS lead bytes // with 0xFFFF. for( jj = 0; jj < 256; jj++ ) { if( IsDBCSLeadByte( (UCHAR)jj )) { pwcSBC[jj] = (WCHAR) 0xFFFF; } else { st = RtlMultiByteToUnicodeN ( &pwcSBC[jj], sizeof(WCHAR), &cjResult, &ch[jj], 1 ); if( !NT_SUCCESS(st) ) { WARNING("GDI32: RtlMultByteToUnicodeN error."); LOCALFREE(pwc); return(FALSE); } } } } // The table is good, jam it in. Watch out for another thread running this // routine simultaneously. ENTERCRITICALSECTION(&semLocal); { if (gpwcANSICharSet == (WCHAR *) NULL) { gpwcANSICharSet = pwc; gpwcDBCSCharSet = pwcSBC; pwc = (WCHAR *) NULL; } } LEAVECRITICALSECTION(&semLocal); // If we collided with another thread, clean up our extra space. if (pwc != (WCHAR *) NULL) LOCALFREE(pwc); // At this point we have a valid mapping. return(TRUE); }