UINT32 ali_otp_read(UINT16 addr) { SET_WORD(REG_ADDR, addr&0xfffc); SET_DWORD(REG_CTRL, GET_DWORD(REG_CTRL)|OTP_READ_TRIG); while(GET_DWORD(REG_CTRL) & OTP_READ_BUSY); return GET_DWORD(REG_RDATA); }
void debug_network(char* data,u32 data_len) { char* ip_payload; t_data_sckt_buf* data_sckt_buf=alloc_sckt(33+HEADER_ETH+HEADER_IP4+HEADER_UDP); data_sckt_buf->transport_hdr=data_sckt_buf->data+HEADER_ETH+HEADER_IP4; ip_payload=data_sckt_buf->transport_hdr+HEADER_UDP; // u32 src_ip=GET_DWORD(172,16,6,101); // u32 dst_ip=GET_DWORD(172,16,6,1); u32 src_ip=GET_DWORD(172,16,243,101); u32 dst_ip=GET_DWORD(172,16,243,1); // u32 dst_ip=GET_DWORD(95,246,209,232); kmemcpy(ip_payload,data,data_len); send_packet_udp(data_sckt_buf,src_ip,dst_ip,9999,45446,data_len); }
/*********************************************************************** * DIALOG_GetControl16 * * Return the class and text of the control pointed to by ptr, * fill the header structure and return a pointer to the next control. */ static LPCSTR DIALOG_GetControl16( LPCSTR p, DLG_CONTROL_INFO *info ) { static char buffer[10]; int int_id; info->x = GET_WORD(p); p += sizeof(WORD); info->y = GET_WORD(p); p += sizeof(WORD); info->cx = GET_WORD(p); p += sizeof(WORD); info->cy = GET_WORD(p); p += sizeof(WORD); info->id = GET_WORD(p); p += sizeof(WORD); info->style = GET_DWORD(p); p += sizeof(DWORD); if (*p & 0x80) { switch((BYTE)*p) { case 0x80: strcpy( buffer, "BUTTON" ); break; case 0x81: strcpy( buffer, "EDIT" ); break; case 0x82: strcpy( buffer, "STATIC" ); break; case 0x83: strcpy( buffer, "LISTBOX" ); break; case 0x84: strcpy( buffer, "SCROLLBAR" ); break; case 0x85: strcpy( buffer, "COMBOBOX" ); break; default: buffer[0] = '\0'; break; } info->className = buffer; p++; } else { info->className = p; p += strlen(p) + 1; } int_id = ((BYTE)*p == 0xff); if (int_id) { /* Integer id, not documented (?). Only works for SS_ICON controls */ info->windowName = MAKEINTRESOURCEA(GET_WORD(p+1)); p += 3; } else { info->windowName = p; p += strlen(p) + 1; } if (*p) info->data = p + 1; else info->data = NULL; p += *p + 1; TRACE(" %s %s %d, %d, %d, %d, %d, %08x, %p\n", debugstr_a(info->className), debugstr_a(info->windowName), info->id, info->x, info->y, info->cx, info->cy, info->style, info->data ); return p; }
/********************************************************************** * Convert ActiveX control templates to AtlAxWin class instances */ static LPDLGTEMPLATEW AX_ConvertDialogTemplate(LPCDLGTEMPLATEW src_tmpl) { #define GET_WORD(x) (*(const WORD *)(x)) #define GET_DWORD(x) (*(const DWORD *)(x)) #define PUT_BLOCK(x,y) do {if (!advance_array(&output, &allocated, &filled, (x), (y))) return NULL;} while (0) #define PUT_WORD(x) do {WORD w = (x);PUT_BLOCK(&w, 1);} while(0) #define PUT_DWORD(x) do {DWORD w = (x);PUT_BLOCK(&w, 2);} while(0) const WORD *tmp, *src = (const WORD *)src_tmpl; WORD *output; DWORD allocated, filled; /* in WORDs */ BOOL ext; WORD signature, dlgver, rescount; DWORD style; filled = 0; allocated = 256; output = HeapAlloc( GetProcessHeap(), 0, allocated * sizeof(WORD) ); if (!output) return NULL; /* header */ tmp = src; signature = GET_WORD(src); dlgver = GET_WORD(src + 1); if (signature == 1 && dlgver == 0xFFFF) { ext = TRUE; src += 6; style = GET_DWORD(src); src += 2; rescount = GET_WORD(src++); src += 4; if ( GET_WORD(src) == 0xFFFF ) /* menu */ src += 2; else src += strlenW(src) + 1; if ( GET_WORD(src) == 0xFFFF ) /* class */ src += 2; else src += strlenW(src) + 1; src += strlenW(src) + 1; /* title */ if ( style & (DS_SETFONT | DS_SHELLFONT) ) { src += 3; src += strlenW(src) + 1; } } else { ext = FALSE; style = GET_DWORD(src); src += 4; rescount = GET_WORD(src++); src += 4; if ( GET_WORD(src) == 0xFFFF ) /* menu */ src += 2; else src += strlenW(src) + 1; if ( GET_WORD(src) == 0xFFFF ) /* class */ src += 2; else src += strlenW(src) + 1; src += strlenW(src) + 1; /* title */ if ( style & DS_SETFONT ) { src++; src += strlenW(src) + 1; } } PUT_BLOCK(tmp, src-tmp); while(rescount--) { src = (const WORD *)( ( ((ULONG_PTR)src) + 3) & ~3); /* align on DWORD boundary */ filled = (filled + 1) & ~1; /* depends on DWORD-aligned allocation unit */ tmp = src; if (ext) src += 12; else src += 9; PUT_BLOCK(tmp, src-tmp); tmp = src; if ( GET_WORD(src) == 0xFFFF ) /* class */ { src += 2; } else { src += strlenW(src) + 1; } src += strlenW(src) + 1; /* title */ if ( GET_WORD(tmp) == '{' ) /* all this mess created because of this line */ { static const WCHAR AtlAxWin[] = {'A','t','l','A','x','W','i','n', 0}; PUT_BLOCK(AtlAxWin, sizeof(AtlAxWin)/sizeof(WCHAR)); PUT_BLOCK(tmp, strlenW(tmp)+1); } else PUT_BLOCK(tmp, src-tmp); if ( GET_WORD(src) ) { WORD size = (GET_WORD(src)+sizeof(WORD)-1) / sizeof(WORD); /* quite ugly :( Maybe use BYTE* instead of WORD* everywhere ? */ PUT_BLOCK(src, size); src+=size; } else { PUT_WORD(0); src++; } } return (LPDLGTEMPLATEW) output; }
const WORD* CResModule::CountMemReplaceMenuExResource(const WORD * res, size_t * wordcount, WORD * newMenu) { DWORD dwType, dwState, menuId; WORD bResInfo; WORD *p0; //struct MenuExItem { // DWORD dwType; // DWORD dwState; // DWORD menuId; // WORD bResInfo; // WCHAR szText[]; // DWORD dwHelpId; - Popup menu only //}; do { p0 = (WORD *)res; dwType = GET_DWORD(res); res += 2; dwState = GET_DWORD(res); res += 2; menuId = GET_DWORD(res); res += 2; bResInfo = GET_WORD(res); res++; if (newMenu != NULL) { CopyMemory(&newMenu[*wordcount], p0, 7 * sizeof(WORD)); } (*wordcount) += 7; if (dwType & MFT_SEPARATOR) { // Align to DWORD (*wordcount)++; res++; continue; } if (bResInfo & 0x01) { ReplaceStr((LPCWSTR)res, newMenu, wordcount, &m_bTranslatedMenuStrings, &m_bDefaultMenuStrings); res += wcslen((LPCWSTR)res) + 1; // Align to DWORD res += ((((WORD)res + 3) & ~3) - (WORD)res)/sizeof(WORD); if ((*wordcount) & 0x01) (*wordcount)++; if (newMenu != NULL) CopyMemory(&newMenu[*wordcount], res, sizeof(DWORD)); // Copy Help ID res += 2; (*wordcount) += 2; if ((res = CountMemReplaceMenuExResource(res, wordcount, newMenu)) == 0) return NULL; } else if (menuId != 0) { ReplaceStr((LPCWSTR)res, newMenu, wordcount, &m_bTranslatedMenuStrings, &m_bDefaultMenuStrings); res += wcslen((LPCWSTR)res) + 1; } else { if (newMenu) wcscpy((wchar_t *)&newMenu[(*wordcount)], (LPCWSTR)res); (*wordcount) += wcslen((LPCWSTR)res) + 1; res += wcslen((LPCWSTR)res) + 1; } // Align to DWORD res += ((((WORD)res + 3) & ~3) - (WORD)res)/sizeof(WORD); if ((*wordcount) & 0x01) (*wordcount)++; } while (!(bResInfo & 0x80)); return res; }
const WORD* CResModule::ParseMenuExResource(const WORD * res) { DWORD dwType, dwState, menuId; WORD bResInfo; LPCWSTR str; WORD *p0; //struct MenuExItem { // DWORD dwType; // DWORD dwState; // DWORD menuId; // WORD bResInfo; // WCHAR szText[]; // DWORD dwHelpId; - Popup menu only //}; do { p0 = (WORD *)res; dwType = GET_DWORD(res); res += 2; dwState = GET_DWORD(res); res += 2; menuId = GET_DWORD(res); res += 2; bResInfo = GET_WORD(res); res++; str = (LPCWSTR)res; size_t l = wcslen(str)+1; res += l; // Align to DWORD boundary res += ((((WORD)res + 3) & ~3) - (WORD)res)/sizeof(WORD); if (dwType & MFT_SEPARATOR) continue; if (bResInfo & 0x01) { // Popup menu - note this can also have a non-zero ID if (menuId == 0) menuId = (WORD)-1; TCHAR * pBuf = new TCHAR[MAX_STRING_LENGTH]; SecureZeroMemory(pBuf, MAX_STRING_LENGTH * sizeof(TCHAR)); _tcscpy(pBuf, str); CUtils::StringExtend(pBuf); std::wstring wstr = std::wstring(pBuf); RESOURCEENTRY entry = m_StringEntries[wstr]; // Popup has a DWORD help entry on a DWORD boundary - skip over it res += 2; entry.resourceIDs.insert(menuId); TCHAR szTempBuf[1024]; _stprintf(szTempBuf, _T("#: MenuExPopupEntry; ID:%d"), menuId); MENUENTRY menu_entry; menu_entry.wID = (WORD)menuId; menu_entry.reference = szTempBuf; menu_entry.msgstr = wstr; m_StringEntries[wstr] = entry; m_MenuEntries[(WORD)menuId] = menu_entry; delete [] pBuf; if ((res = ParseMenuExResource(res)) == 0) return NULL; } else if (menuId != 0) { TCHAR * pBuf = new TCHAR[MAX_STRING_LENGTH]; SecureZeroMemory(pBuf, MAX_STRING_LENGTH * sizeof(TCHAR)); _tcscpy(pBuf, str); CUtils::StringExtend(pBuf); std::wstring wstr = std::wstring(pBuf); RESOURCEENTRY entry = m_StringEntries[wstr]; entry.resourceIDs.insert(menuId); TCHAR szTempBuf[1024]; _stprintf(szTempBuf, _T("#: MenuExEntry; ID:%d"), menuId); MENUENTRY menu_entry; menu_entry.wID = (WORD)menuId; menu_entry.reference = szTempBuf; menu_entry.msgstr = wstr; m_StringEntries[wstr] = entry; m_MenuEntries[(WORD)menuId] = menu_entry; delete [] pBuf; } } while (!(bResInfo & 0x80)); return res; }
BOOL CResModule::ReplaceMenu(UINT nID, WORD wLanguage) { HRSRC hrsrc = FindResourceEx(m_hResDll, RT_MENU, MAKEINTRESOURCE(nID), wLanguage); HGLOBAL hglMenuTemplate; WORD version, offset; LPWSTR p; WORD *p0; DWORD dwHelpId; if (!hrsrc) MYERROR; //just the language wasn't found hglMenuTemplate = LoadResource(m_hResDll, hrsrc); if (!hglMenuTemplate) MYERROR; p = (LPWSTR)LockResource(hglMenuTemplate); if (p == NULL) MYERROR; //struct MenuHeader { // WORD wVersion; // Currently zero // WORD cbHeaderSize; // Also zero //}; // MENUEX resource //struct MenuExHeader { // WORD wVersion; // One // WORD wOffset; // DWORD dwHelpId; //}; p0 = (WORD *)p; version = GET_WORD(p); p++; switch (version) { case 0: { offset = GET_WORD(p); p += offset; p++; size_t nMem = 0; if (!CountMemReplaceMenuResource((WORD *)p, &nMem, NULL)) goto DONE_ERROR; WORD * newMenu = new WORD[nMem + (nMem % 2)+2]; SecureZeroMemory(newMenu, (nMem + (nMem % 2)+2)*2); size_t index = 2; // MenuHeader has 2 WORDs zero if (!CountMemReplaceMenuResource((WORD *)p, &index, newMenu)) { delete [] newMenu; goto DONE_ERROR; } if (!UpdateResource(m_hUpdateRes, RT_MENU, MAKEINTRESOURCE(nID), (m_wTargetLang ? m_wTargetLang : wLanguage), newMenu, (DWORD)(nMem + (nMem % 2)+2)*2)) { delete [] newMenu; goto DONE_ERROR; } if ((m_wTargetLang)&&(!UpdateResource(m_hUpdateRes, RT_MENU, MAKEINTRESOURCE(nID), wLanguage, NULL, 0))) { delete [] newMenu; goto DONE_ERROR; } delete [] newMenu; } break; case 1: { offset = GET_WORD(p); p++; dwHelpId = GET_DWORD(p); size_t nMem = 0; if (!CountMemReplaceMenuExResource((WORD *)(p0 + offset), &nMem, NULL)) goto DONE_ERROR; WORD * newMenu = new WORD[nMem + (nMem % 2) + 4]; SecureZeroMemory(newMenu, (nMem + (nMem % 2) + 4) * 2); CopyMemory(newMenu, p0, 2 * sizeof(WORD) + sizeof(DWORD)); size_t index = 4; // MenuExHeader has 2 x WORD + 1 x DWORD if (!CountMemReplaceMenuExResource((WORD *)(p0 + offset), &index, newMenu)) { delete [] newMenu; goto DONE_ERROR; } if (!UpdateResource(m_hUpdateRes, RT_MENU, MAKEINTRESOURCE(nID), (m_wTargetLang ? m_wTargetLang : wLanguage), newMenu, (DWORD)(nMem + (nMem % 2) + 4) * 2)) { delete [] newMenu; goto DONE_ERROR; } if ((m_wTargetLang)&&(!UpdateResource(m_hUpdateRes, RT_MENU, MAKEINTRESOURCE(nID), wLanguage, NULL, 0))) { delete [] newMenu; goto DONE_ERROR; } delete [] newMenu; } break; default: goto DONE_ERROR; } UnlockResource(hglMenuTemplate); FreeResource(hglMenuTemplate); return TRUE; DONE_ERROR: UnlockResource(hglMenuTemplate); FreeResource(hglMenuTemplate); MYERROR; }
BOOL CResModule::ExtractMenu(UINT nID) { HRSRC hrsrc = FindResource(m_hResDll, MAKEINTRESOURCE(nID), RT_MENU); HGLOBAL hglMenuTemplate; WORD version, offset; DWORD dwHelpId; const WORD *p, *p0; if (!hrsrc) MYERROR; hglMenuTemplate = LoadResource(m_hResDll, hrsrc); if (!hglMenuTemplate) MYERROR; p = (const WORD*)LockResource(hglMenuTemplate); if (p == NULL) MYERROR; // Standard MENU resource //struct MenuHeader { // WORD wVersion; // Currently zero // WORD cbHeaderSize; // Also zero //}; // MENUEX resource //struct MenuExHeader { // WORD wVersion; // One // WORD wOffset; // DWORD dwHelpId; //}; p0 = p; version = GET_WORD(p); p++; switch (version) { case 0: { offset = GET_WORD(p); p += offset; p++; if (!ParseMenuResource(p)) goto DONE_ERROR; } break; case 1: { offset = GET_WORD(p); p++; dwHelpId = GET_DWORD(p); if (!ParseMenuExResource(p0 + offset)) goto DONE_ERROR; } break; default: goto DONE_ERROR; } UnlockResource(hglMenuTemplate); FreeResource(hglMenuTemplate); return TRUE; DONE_ERROR: UnlockResource(hglMenuTemplate); FreeResource(hglMenuTemplate); MYERROR; }
const WORD * CResModule::CountMemReplaceDialogResource(const WORD * res, size_t * wordcount, WORD * newDialog) { BOOL bEx = FALSE; DWORD style = GET_DWORD(res); if (newDialog) { newDialog[(*wordcount)++] = GET_WORD(res++); newDialog[(*wordcount)++] = GET_WORD(res++); } else { res += 2; (*wordcount) += 2; } if (style == 0xffff0001) // DIALOGEX resource { bEx = TRUE; if (newDialog) { newDialog[(*wordcount)++] = GET_WORD(res++); //help id newDialog[(*wordcount)++] = GET_WORD(res++); //help id newDialog[(*wordcount)++] = GET_WORD(res++); //exStyle newDialog[(*wordcount)++] = GET_WORD(res++); //exStyle style = GET_DWORD(res); newDialog[(*wordcount)++] = GET_WORD(res++); //style newDialog[(*wordcount)++] = GET_WORD(res++); //style } else { res += 4; style = GET_DWORD(res); res += 2; (*wordcount) += 6; } } else { bEx = FALSE; if (newDialog) { newDialog[(*wordcount)++] = GET_WORD(res++); //exStyle newDialog[(*wordcount)++] = GET_WORD(res++); //exStyle //style = GET_DWORD(res); //newDialog[(*wordcount)++] = GET_WORD(res++); //style //newDialog[(*wordcount)++] = GET_WORD(res++); //style } else { res += 2; (*wordcount) += 2; } } if (newDialog) newDialog[(*wordcount)] = GET_WORD(res); WORD nbItems = GET_WORD(res); (*wordcount)++; res++; if (newDialog) newDialog[(*wordcount)] = GET_WORD(res); //x (*wordcount)++; res++; if (newDialog) newDialog[(*wordcount)] = GET_WORD(res); //y (*wordcount)++; res++; if (newDialog) newDialog[(*wordcount)] = GET_WORD(res); //cx (*wordcount)++; res++; if (newDialog) newDialog[(*wordcount)] = GET_WORD(res); //cy (*wordcount)++; res++; // Get the menu name switch (GET_WORD(res)) { case 0x0000: if (newDialog) newDialog[(*wordcount)] = GET_WORD(res); (*wordcount)++; res++; break; case 0xffff: if (newDialog) { newDialog[(*wordcount)++] = GET_WORD(res++); newDialog[(*wordcount)++] = GET_WORD(res++); } else { (*wordcount) += 2; res += 2; } break; default: if (newDialog) { wcscpy((LPWSTR)&newDialog[(*wordcount)], (LPCWSTR)res); } (*wordcount) += wcslen((LPCWSTR) res) + 1; res += wcslen((LPCWSTR) res) + 1; break; } // Get the class name switch (GET_WORD(res)) { case 0x0000: if (newDialog) newDialog[(*wordcount)] = GET_WORD(res); (*wordcount)++; res++; break; case 0xffff: if (newDialog) { newDialog[(*wordcount)++] = GET_WORD(res++); newDialog[(*wordcount)++] = GET_WORD(res++); } else { (*wordcount) += 2; res += 2; } break; default: if (newDialog) { wcscpy((LPWSTR)&newDialog[(*wordcount)], (LPCWSTR)res); } (*wordcount) += wcslen((LPCWSTR) res) + 1; res += wcslen((LPCWSTR) res) + 1; break; } // Get the window caption ReplaceStr((LPCWSTR)res, newDialog, wordcount, &m_bTranslatedDialogStrings, &m_bDefaultDialogStrings); res += wcslen((LPCWSTR)res) + 1; // Get the font name if (style & DS_SETFONT) { if (newDialog) newDialog[(*wordcount)] = GET_WORD(res); res++; (*wordcount)++; if (bEx) { if (newDialog) { newDialog[(*wordcount)++] = GET_WORD(res++); newDialog[(*wordcount)++] = GET_WORD(res++); } else { res += 2; (*wordcount) += 2; } } if (newDialog) wcscpy((LPWSTR)&newDialog[(*wordcount)], (LPCWSTR)res); (*wordcount) += wcslen((LPCWSTR)res) + 1; res += wcslen((LPCWSTR)res) + 1; } // First control is on DWORD boundary while ((*wordcount)%2) (*wordcount)++; while ((ULONG)res % 4) res++; while (nbItems--) { res = ReplaceControlInfo(res, wordcount, newDialog, bEx); } return res; }
const WORD* CResModule::GetControlInfo(const WORD* p, LPDLGITEMINFO lpDlgItemInfo, BOOL dialogEx, LPBOOL bIsID) { if (dialogEx) { lpDlgItemInfo->helpId = GET_DWORD(p); p += 2; lpDlgItemInfo->exStyle = GET_DWORD(p); p += 2; lpDlgItemInfo->style = GET_DWORD(p); p += 2; } else { lpDlgItemInfo->helpId = 0; lpDlgItemInfo->style = GET_DWORD(p); p += 2; lpDlgItemInfo->exStyle = GET_DWORD(p); p += 2; } lpDlgItemInfo->x = GET_WORD(p); p++; lpDlgItemInfo->y = GET_WORD(p); p++; lpDlgItemInfo->cx = GET_WORD(p); p++; lpDlgItemInfo->cy = GET_WORD(p); p++; if (dialogEx) { // ID is a DWORD for DIALOGEX lpDlgItemInfo->id = (WORD) GET_DWORD(p); p += 2; } else { lpDlgItemInfo->id = GET_WORD(p); p++; } if (GET_WORD(p) == 0xffff) { GET_WORD(p + 1); p += 2; } else { lpDlgItemInfo->className = (LPCTSTR) p; p += wcslen((LPCWSTR) p) + 1; } if (GET_WORD(p) == 0xffff) // an integer ID? { *bIsID = TRUE; lpDlgItemInfo->windowName = (LPCTSTR) (DWORD) GET_WORD(p + 1); p += 2; } else { *bIsID = FALSE; lpDlgItemInfo->windowName = (LPCTSTR) p; p += wcslen((LPCWSTR) p) + 1; } if (GET_WORD(p)) { lpDlgItemInfo->data = (LPVOID) (p + 1); p += GET_WORD(p) / sizeof(WORD); } else lpDlgItemInfo->data = NULL; p++; // Next control is on DWORD boundary return (const WORD *)((((long)p) + 3) & ~3); }
const WORD* CResModule::GetDialogInfo(const WORD * pTemplate, LPDIALOGINFO lpDlgInfo) { const WORD* p = (const WORD *)pTemplate; lpDlgInfo->style = GET_DWORD(p); p += 2; if (lpDlgInfo->style == 0xffff0001) // DIALOGEX resource { lpDlgInfo->dialogEx = TRUE; lpDlgInfo->helpId = GET_DWORD(p); p += 2; lpDlgInfo->exStyle = GET_DWORD(p); p += 2; lpDlgInfo->style = GET_DWORD(p); p += 2; } else { lpDlgInfo->dialogEx = FALSE; lpDlgInfo->helpId = 0; lpDlgInfo->exStyle = GET_DWORD(p); p += 2; } lpDlgInfo->nbItems = GET_WORD(p); p++; lpDlgInfo->x = GET_WORD(p); p++; lpDlgInfo->y = GET_WORD(p); p++; lpDlgInfo->cx = GET_WORD(p); p++; lpDlgInfo->cy = GET_WORD(p); p++; // Get the menu name switch (GET_WORD(p)) { case 0x0000: lpDlgInfo->menuName = NULL; p++; break; case 0xffff: lpDlgInfo->menuName = (LPCTSTR) (WORD) GET_WORD(p + 1); p += 2; break; default: lpDlgInfo->menuName = (LPCTSTR) p; p += wcslen((LPCWSTR) p) + 1; break; } // Get the class name switch (GET_WORD(p)) { case 0x0000: lpDlgInfo->className = (LPCTSTR)MAKEINTATOM(32770); p++; break; case 0xffff: lpDlgInfo->className = (LPCTSTR) (WORD) GET_WORD(p + 1); p += 2; break; default: lpDlgInfo->className = (LPCTSTR) p; p += wcslen((LPCTSTR)p) + 1; break; } // Get the window caption lpDlgInfo->caption = (LPCTSTR)p; p += wcslen((LPCWSTR) p) + 1; // Get the font name if (lpDlgInfo->style & DS_SETFONT) { lpDlgInfo->pointSize = GET_WORD(p); p++; if (lpDlgInfo->dialogEx) { lpDlgInfo->weight = GET_WORD(p); p++; lpDlgInfo->italic = LOBYTE(GET_WORD(p)); p++; } else { lpDlgInfo->weight = FW_DONTCARE; lpDlgInfo->italic = FALSE; } lpDlgInfo->faceName = (LPCTSTR)p; p += wcslen((LPCWSTR) p) + 1; } // First control is on DWORD boundary return (const WORD *) ((((long)p) + 3) & ~3); }
void StreamEventDemuxer::parseReferenceNPT( BYTE *section ) { BYTE descLen = GET_SE_LEN(section); bool postDiscontinuityIndicator = GET_BYTE(section+2) & 0x80 ? true : false; BYTE contentID = GET_BYTE(section+2) & 0x7F; QWORD stcReference = ((QWORD(GET_BYTE(section+3) & 0x1)) << 32) | (0x00000000FFFFFFFFLLU & (GET_DWORD(section+4))); QWORD nptReference = GET_QWORD(section+8) & 0x00000001FFFFFFFFLLU; WORD scaleNumerator = GET_WORD(section+16); WORD scaleDenominator = GET_WORD(section+18); printf( "[DSMCCDemuxer] Reference NPT: len=%d, post=%d, contentID=%d, stc=%llx, npt=%llx, nominator=%x, denominator=%x\n", descLen, postDiscontinuityIndicator, contentID, stcReference, nptReference, scaleNumerator, scaleDenominator ); }
/** * This can't be implemented directly with QT. * (We can use QSound to play local files but that was not enough. * Also support of media formats is limited) * * Current implementation is copied from GTK side and implementation uses ESD interface. * * If we have Qtopia then we can drop ESD implementation and use Qtopia "Multimedia API" */ NS_IMETHODIMP nsSound::OnStreamComplete(nsIStreamLoader *aLoader, nsISupports *context, nsresult aStatus, PRUint32 dataLen, const PRUint8 *data) { #define GET_WORD(s, i) (s[i+1] << 8) | s[i] #define GET_DWORD(s, i) (s[i+3] << 24) | (s[i+2] << 16) | (s[i+1] << 8) | s[i] // print a load error on bad status, and return if (NS_FAILED(aStatus)) { #ifdef DEBUG if (aLoader) { nsCOMPtr<nsIRequest> request; aLoader->GetRequest(getter_AddRefs(request)); if (request) { nsCOMPtr<nsIURI> uri; nsCOMPtr<nsIChannel> channel = do_QueryInterface(request); if (channel) { channel->GetURI(getter_AddRefs(uri)); if (uri) { nsCAutoString uriSpec; uri->GetSpec(uriSpec); printf("Failed to load %s\n", uriSpec.get()); } } } } #endif return aStatus; } int fd, mask = 0; PRUint32 samples_per_sec = 0, avg_bytes_per_sec = 0, chunk_len = 0; PRUint16 format, channels = 1, bits_per_sample = 0; const PRUint8 *audio = nsnull; size_t audio_len = 0; if (dataLen < 4) { NS_WARNING("Sound stream too short to determine its type"); return NS_ERROR_FAILURE; } if (memcmp(data, "RIFF", 4)) { #ifdef DEBUG printf("We only support WAV files currently.\n"); #endif return NS_ERROR_FAILURE; } if (dataLen <= WAV_MIN_LENGTH) { NS_WARNING("WAV files should be longer than 44 bytes."); return NS_ERROR_FAILURE; } PRUint32 i = 12; while (i + 7 < dataLen) { if (!memcmp(data + i, "fmt ", 4) && !chunk_len) { i += 4; /* length of the rest of this subblock (should be 16 for PCM data */ chunk_len = GET_DWORD(data, i); i += 4; if (chunk_len < 16 || i + chunk_len >= dataLen) { NS_WARNING("Invalid WAV file: bad fmt chunk."); return NS_ERROR_FAILURE; } format = GET_WORD(data, i); i += 2; channels = GET_WORD(data, i); i += 2; samples_per_sec = GET_DWORD(data, i); i += 4; avg_bytes_per_sec = GET_DWORD(data, i); i += 4; // block align i += 2; bits_per_sample = GET_WORD(data, i); i += 2; /* we don't support WAVs with odd compression codes */ if (chunk_len != 16) NS_WARNING("Extra format bits found in WAV. Ignoring"); i += chunk_len - 16; } else if (!memcmp(data + i, "data", 4)) { i += 4; if (!chunk_len) { NS_WARNING("Invalid WAV file: no fmt chunk found"); return NS_ERROR_FAILURE; } audio_len = GET_DWORD(data, i); i += 4; /* try to play truncated WAVs */ if (i + audio_len > dataLen) audio_len = dataLen - i; audio = data + i; break; } else { i += 4; i += GET_DWORD(data, i); i += 4; } } if (!audio) { NS_WARNING("Invalid WAV file: no data chunk found"); return NS_ERROR_FAILURE; } /* No audio data? well, at least the WAV was valid. */ if (!audio_len) return NS_OK; #if 0 printf("f: %d | c: %d | sps: %li | abps: %li | ba: %d | bps: %d | rate: %li\n", format, channels, samples_per_sec, avg_bytes_per_sec, block_align, bits_per_sample, rate); #endif /* open up connection to esd */ EsdPlayStreamType EsdPlayStream = (EsdPlayStreamType) PR_FindFunctionSymbol(elib, "esd_play_stream"); if (!EsdPlayStream) return NS_ERROR_FAILURE; mask = ESD_PLAY | ESD_STREAM; if (bits_per_sample == 8) mask |= ESD_BITS8; else mask |= ESD_BITS16; if (channels == 1) mask |= ESD_MONO; else mask |= ESD_STEREO; nsAutoArrayPtr<PRUint8> buf; // ESD only handle little-endian data. // Swap the byte order if we're on a big-endian architecture. #ifdef IS_BIG_ENDIAN if (bits_per_sample != 8) { buf = new PRUint8[audio_len]; if (!buf) return NS_ERROR_OUT_OF_MEMORY; for (PRUint32 j = 0; j + 2 < audio_len; j += 2) { buf[j] = audio[j + 1]; buf[j + 1] = audio[j]; } audio = buf; } #endif fd = (*EsdPlayStream)(mask, samples_per_sec, NULL, "mozillaSound"); if (fd < 0) { int *esd_audio_format = (int *) PR_FindSymbol(elib, "esd_audio_format"); int *esd_audio_rate = (int *) PR_FindSymbol(elib, "esd_audio_rate"); EsdAudioOpenType EsdAudioOpen = (EsdAudioOpenType) PR_FindFunctionSymbol(elib, "esd_audio_open"); EsdAudioWriteType EsdAudioWrite = (EsdAudioWriteType) PR_FindFunctionSymbol(elib, "esd_audio_write"); EsdAudioCloseType EsdAudioClose = (EsdAudioCloseType) PR_FindFunctionSymbol(elib, "esd_audio_close"); if (!esd_audio_format || !esd_audio_rate || !EsdAudioOpen || !EsdAudioWrite || !EsdAudioClose) return NS_ERROR_FAILURE; *esd_audio_format = mask; *esd_audio_rate = samples_per_sec; fd = (*EsdAudioOpen)(); if (fd < 0) return NS_ERROR_FAILURE; (*EsdAudioWrite)(audio, audio_len); (*EsdAudioClose)(); } else { while (audio_len > 0) { size_t written = write(fd, audio, audio_len); if (written <= 0) break; audio += written; audio_len -= written; } close(fd); } return NS_OK; }
// ======================================================= void CHfsPart::readSuperBlock() { BEGIN; QWORD qwBlocksInRegularAlloc; hfsSuperBlock sb, sb2; int nRes; // read superblock nRes = readData(&sb, 1024, sizeof(sb)); if (nRes == -1) { showDebug(10, "ERROR 1\n"); g_interface -> ErrorReadingSuperblock(errno); THROW(ERR_READING, (DWORD)0, errno); } if (Be16ToCpu(GET_WORD(&sb.drSigWord)) != HFS_SUPER_MAGIC) { showDebug(10, "ERROR 2\n"); g_interface -> ErrorReadingSuperblock(errno); THROW(ERR_READING, (DWORD)0, errno); } // init memset(&m_info, 0, sizeof(CInfoHfsHeader)); m_info.qwAllocCount = BeToCpu(GET_WORD(&sb.drNmAlBlks)); m_info.dwAllocSize = BeToCpu(GET_DWORD(&sb.drAlBlkSize)); m_info.dwBlocksPerAlloc = m_info.dwAllocSize / 512; m_info.qwBitmapSectLocation = (QWORD)BeToCpu(GET_WORD(&sb.drVBMSt)); m_info.qwFirstAllocBlock = (QWORD)BeToCpu(GET_WORD(&sb.drAlBlSt)); m_info.qwFreeAllocs = (QWORD)BeToCpu(GET_WORD(&sb.drFreeBks)); // if not a 512 multiple if ((m_info.dwAllocSize % 512) != 0) THROW(ERR_READING, (DWORD)0, errno); // check the last but one block is a superblock qwBlocksInRegularAlloc = m_info.dwBlocksPerAlloc * m_info.qwAllocCount; nRes = readData(&sb2, (m_info.qwFirstAllocBlock+qwBlocksInRegularAlloc)*512LL, sizeof(sb2)); if (nRes == -1) { showDebug(10, "ERROR 3\n"); g_interface -> ErrorReadingSuperblock(errno); THROW(ERR_READING, (DWORD)0, errno); } if (Be16ToCpu(GET_WORD(&sb.drSigWord)) != HFS_SUPER_MAGIC) { showDebug(10, "ERROR 4\n"); g_interface -> ErrorReadingSuperblock(errno); THROW(ERR_READING, (DWORD)0, errno); } // show infos showDebug(10, "m_info.qwAllocCount=%llu\n", m_info.qwAllocCount); showDebug(10, "m_info.dwAllocSize=%lu=%lu sectors\n", m_info.dwAllocSize, m_info.dwBlocksPerAlloc); showDebug(10, "m_info.qwBitmapSectLocation=%llu\n", m_info.qwBitmapSectLocation); showDebug(10, "m_info.qwFirstAllocBlock=%llu\n", m_info.qwFirstAllocBlock); showDebug(10, "m_info.qwFreeAllocs=%llu\n", m_info.qwFreeAllocs); // label == pascal string memset(m_header.szLabel, 0, 64); memcpy(m_header.szLabel, ((char*)&sb.drVN)+1, my_min(((BYTE*)&sb.drVN)[0], 63)); showDebug(10, "label=[%s]\n", m_header.szLabel); // calculate sectors count m_header.qwBlocksCount = m_info.qwFirstAllocBlock // first reserved (2 boot blocks, 1 superblock, ...) + (m_info.dwBlocksPerAlloc * m_info.qwAllocCount) // allocation blocks + 1 // alternate superblock + 1; // last volume of sector showDebug(10, "m_header.qwBlocksCount = %llu\n", m_header.qwBlocksCount); m_header.qwBlockSize = 512; m_header.qwBitmapSize = (m_header.qwBlocksCount+7)/8; QWORD qwUsedBlocks = m_info.qwFirstAllocBlock + 2 + ((m_info.qwAllocCount-m_info.qwFreeAllocs) * m_info.dwBlocksPerAlloc); QWORD qwFreeBlocks = m_info.qwFreeAllocs * m_info.dwBlocksPerAlloc; setSuperBlockInfos(true, true, qwUsedBlocks*512, qwFreeBlocks*512); RETURN; }
TEST( Types, basic_dword_get ) { util::DWORD result = GET_DWORD(types::values); ASSERT_TRUE( result == 0xAA55AA55L ); }