BOOLEAN FBaseMain( IN PVOID DllHandle, ULONG Reason, IN PCONTEXT Context OPTIONAL) { static TCHAR szDumpFile[15]; USHORT Type; void FreeMemoryOfHandle(); // if process is attaching, initialize the dll if (Reason == DLL_PROCESS_ATTACH) { GdiSetBatchLimit (1); FileSyncProfInitDll(); } else if (Reason == DLL_THREAD_ATTACH) { GdiSetBatchLimit (1); } else if (Reason == DLL_PROCESS_DETACH) { lstrcpy ((LPTSTR)szDumpFile, MODULE_NAME); lstrcat ((LPTSTR)szDumpFile, L".end"); FileSyncProfDumpData ((LPTSTR)szDumpFile); WaitForSingleObject ( hMutex, INFINITE ); FreeMemoryOfList (phInactive); FreeMemoryOfList (phActive); FreeMemoryOfHandle (phDuplicated); phActive = phInactive = phDuplicated = (PFP_Handle) NULL; ReleaseMutex ( hMutex ); for ( Type = 0; Type < NUMOFSYNC; ) { WaitForSingleObject ( hSMutex[Type], INFINITE ); FreeMemoryOfSList (phSInactive[Type]); FreeMemoryOfSList (phSActive[Type]); FreeMemoryOfSHandle (phSDuplicated[Type]); phSActive[Type] = phSInactive[Type] = phSDuplicated[Type] = (PSP_Handle) NULL; ReleaseMutex ( hSMutex[Type++] ); } // Clean-up CloseHandle ( hDumpEvent ); CloseHandle ( hClearEvent ); UnmapViewOfFile ( (LPVOID) tszDumpFileName ); CloseHandle ( hDumpFileMapping ); CloseHandle ( hWaitingForDumpThread ); CloseHandle ( hWaitingForClearThread ); CloseHandle ( hMutex ); for ( Type = 0; Type < NUMOFSYNC; ) CloseHandle ( hSMutex[Type++] ); } return(TRUE); }
void _gdk_windowing_init (void) { gchar buf[10]; if (getenv ("GDK_IGNORE_WINTAB") != NULL) _gdk_input_ignore_wintab = TRUE; else if (getenv ("GDK_USE_WINTAB") != NULL) _gdk_input_ignore_wintab = FALSE; if (gdk_synchronize) GdiSetBatchLimit (1); _gdk_app_hmodule = GetModuleHandle (NULL); _gdk_display_hdc = CreateDC ("DISPLAY", NULL, NULL, NULL); _gdk_input_locale = GetKeyboardLayout (0); _gdk_input_locale_is_ime = ImmIsIME (_gdk_input_locale); GetLocaleInfo (MAKELCID (LOWORD (_gdk_input_locale), SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, buf, sizeof (buf)); _gdk_input_codepage = atoi (buf); GDK_NOTE (EVENTS, g_print ("input_locale:%p, codepage:%d\n", _gdk_input_locale, _gdk_input_codepage)); CoInitialize (NULL); _gdk_selection = gdk_atom_intern_static_string ("GDK_SELECTION"); _wm_transient_for = gdk_atom_intern_static_string ("WM_TRANSIENT_FOR"); _targets = gdk_atom_intern_static_string ("TARGETS"); _delete = gdk_atom_intern_static_string ("DELETE"); _save_targets = gdk_atom_intern_static_string ("SAVE_TARGETS"); _utf8_string = gdk_atom_intern_static_string ("UTF8_STRING"); _text = gdk_atom_intern_static_string ("TEXT"); _compound_text = gdk_atom_intern_static_string ("COMPOUND_TEXT"); _text_uri_list = gdk_atom_intern_static_string ("text/uri-list"); _text_html = gdk_atom_intern_static_string ("text/html"); _image_png = gdk_atom_intern_static_string ("image/png"); _image_jpeg = gdk_atom_intern_static_string ("image/jpeg"); _image_bmp = gdk_atom_intern_static_string ("image/bmp"); _image_gif = gdk_atom_intern_static_string ("image/gif"); _local_dnd = gdk_atom_intern_static_string ("LocalDndSelection"); _gdk_win32_dropfiles = gdk_atom_intern_static_string ("DROPFILES_DND"); _gdk_ole2_dnd = gdk_atom_intern_static_string ("OLE2_DND"); /* MS Office 2007, at least, offers images in common file formats * using clipboard format names like "PNG" and "JFIF". So we follow * the lead and map the GDK target name "image/png" to the clipboard * format name "PNG" etc. */ _cf_png = RegisterClipboardFormat ("PNG"); _cf_jfif = RegisterClipboardFormat ("JFIF"); _cf_gif = RegisterClipboardFormat ("GIF"); _cf_url = RegisterClipboardFormat ("UniformResourceLocatorW"); _cf_html_format = RegisterClipboardFormat ("HTML Format"); _cf_text_html = RegisterClipboardFormat ("text/html"); _gdk_win32_selection_init (); }
void _gdk_windowing_init (void) { gchar buf[10]; #ifdef HAVE_WINTAB if (getenv ("GDK_IGNORE_WINTAB") != NULL) _gdk_input_ignore_wintab = TRUE; else if (getenv ("GDK_USE_WINTAB") != NULL) _gdk_input_ignore_wintab = FALSE; #endif if (gdk_synchronize) GdiSetBatchLimit (1); _gdk_app_hmodule = GetModuleHandle (NULL); _gdk_display_hdc = CreateDC ("DISPLAY", NULL, NULL, NULL); _gdk_input_locale = GetKeyboardLayout (0); _gdk_input_locale_is_ime = ImmIsIME (_gdk_input_locale); GetLocaleInfo (MAKELCID (LOWORD (_gdk_input_locale), SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, buf, sizeof (buf)); _gdk_input_codepage = atoi (buf); GDK_NOTE (EVENTS, g_print ("input_locale:%p, codepage:%d\n", _gdk_input_locale, _gdk_input_codepage)); CoInitialize (NULL); _cf_rtf = RegisterClipboardFormat ("Rich Text Format"); _cf_utf8_string = RegisterClipboardFormat ("UTF8_STRING"); _cf_image_bmp = RegisterClipboardFormat ("image/bmp"); _gdk_selection_property = gdk_atom_intern ("GDK_SELECTION", FALSE); _wm_transient_for = gdk_atom_intern ("WM_TRANSIENT_FOR", FALSE); _targets = gdk_atom_intern ("TARGETS", FALSE); _save_targets = gdk_atom_intern ("SAVE_TARGETS", FALSE); _utf8_string = gdk_atom_intern ("UTF8_STRING", FALSE); _text = gdk_atom_intern ("TEXT", FALSE); _compound_text = gdk_atom_intern ("COMPOUND_TEXT", FALSE); _text_uri_list = gdk_atom_intern ("text/uri-list", FALSE); _image_bmp = gdk_atom_intern ("image/bmp", FALSE); _local_dnd = gdk_atom_intern ("LocalDndSelection", FALSE); _gdk_win32_dropfiles = gdk_atom_intern ("DROPFILES_DND", FALSE); _gdk_ole2_dnd = gdk_atom_intern ("OLE2_DND", FALSE); _gdk_win32_selection_init (); }
BOOLEAN ZMain( IN PVOID DllHandle, ULONG Reason, IN PCONTEXT Context OPTIONAL) { static char szDumpFile[13]; NTSTATUS Status; DllHandle, Context; // avoid compiler warnings // if process is attaching, initialize the dll // if (Reason == DLL_PROCESS_ATTACH) { GdiSetBatchLimit (1); ApfInitDll(); } else if (Reason == DLL_THREAD_ATTACH) { GdiSetBatchLimit (1); } else if (Reason == DLL_PROCESS_DETACH) { // // Get semaphore // Status = NtWaitForSingleObject(hDataSem,FALSE,NULL); #ifdef ERRORDBG if (!NT_SUCCESS(Status)) { KdPrint (("WAP: Could not wait for Dsemaphore in ZMain, %lx\n", Status)); } #endif // Number of processes accessing this dll is contained in // ApfData[I_CALIBRATE].cCalls. Decrement this number, and // if this number is then zero, dump the data. ApfData[I_CALIBRATE].cCalls--; if (ApfData[I_CALIBRATE].cCalls == 0) { strcpy (szDumpFile, MODULE_NAME); strcat (szDumpFile, ".end"); ApfDumpData ((LPSTR)szDumpFile); // // Unmap and close sections, and close semaphores // Status = NtUnmapViewOfSection(MyProcess,(PVOID)ApfControl); Status = NtClose(ApfDataSectionHandle); // This instance is now "uninitialized" // fInitDone = FALSE; } // // Release semaphore // Status = NtReleaseSemaphore(hDataSem,1,NULL); #ifdef ERRORDBG if (!NT_SUCCESS(Status)) { KdPrint (("WAP: DSemaphore Not Released in ZMain!! %lx\n", Status)); } #endif } return(TRUE); } /* ZMain () */
//=========================================================================== int APIENTRY WinMain (HINSTANCE passinstance, HINSTANCE previnstance, LPSTR lpCmdLine, int nCmdShow) { #ifdef CPUDEBUG char nomearq[MAX_PATH]; #endif char imagefilename[MAX_PATH]; // DO ONE-TIME INITIALIZATION instance = passinstance; // Initialize COM CoInitialize( NULL ); GdiSetBatchLimit(512); GetProgramDirectory(); RegisterExtensions(); FrameRegisterClass(); Inicializar1(); strcpy(imagefilename, progdir); strcat(imagefilename, NOMEARQTKDOS); if (lpCmdLine[0] != '\0') { CharLowerBuff(&lpCmdLine[strlen(lpCmdLine)-3],3); strcpy(imagefilename, lpCmdLine); } #ifdef CPUDEBUG strcpy(nomearq, progdir); strcat(nomearq, "debugCPU.txt"); DeleteFile(nomearq); arquivocpu = fopen(nomearq, "wb"); #endif do { // DO INITIALIZATION THAT MUST BE REPEATED FOR A RESTART restart = 0; mode = MODE_LOGO; LoadConfiguration(); DebugInitialize(); JoyInitialize(); MemInitialize(); VideoInitialize(); Timer_InitTimer(); FrameCreateWindow(); MemAtualizaSlotAux(); if (imagefilename[0] != '\0') { DiskInsert(0, imagefilename, FALSE, FALSE); imagefilename[0] = '\0'; } // ENTER THE MAIN MESSAGE LOOP EnterMessageLoop(); } while (restart); #ifdef CPUDEBUG //CloseHandle(arquivocpu); fclose(arquivocpu); #endif // Release COM CoUninitialize(); return 0; }
void drawInit(void) { GdiSetBatchLimit(120); }
// the default child constructor... CPushPinDesktop::CPushPinDesktop(HRESULT *phr, CPushSourceDesktop *pFilter) : CSourceStream(NAME("Push Source CPushPinDesktop child/pin"), phr, pFilter, L"Capture"), m_FramesWritten(0), m_bReReadRegistry(0), m_bDeDupe(0), m_iFrameNumber(0), pOldData(NULL), m_bConvertToI420(false), //m_nCurrentBitDepth(32), // negotiated later... m_pParent(pFilter), m_bFormatAlreadySet(false), hRawBitmap(NULL) { // Get the device context of the main display, just to get some metrics for it... globalStart = GetTickCount(); m_iHwndToTrack = (HWND) read_config_setting(TEXT("hwnd_to_track"), NULL); hScrDc = GetDC(m_iHwndToTrack); m_iScreenBitDepth = GetTrueScreenDepth(hScrDc); ASSERT(hScrDc != 0); GdiSetBatchLimit(1); // disable any GDI...just in case this helps anybody... // Get the dimensions of the main desktop window as the default m_rScreen.left = m_rScreen.top = 0; m_rScreen.right = GetDeviceCaps(hScrDc, HORZRES); // NB this *fails* for dual monitor support currently... but we just get the wrong width by default, at least with aero windows 7 both can capture both monitors m_rScreen.bottom = GetDeviceCaps(hScrDc, VERTRES); // now read some custom settings... WarmupCounter(); reReadCurrentPosition(0); int config_width = read_config_setting(TEXT("capture_width"), 0); ASSERT(config_width >= 0); // negatives not allowed... int config_height = read_config_setting(TEXT("capture_height"), 0); ASSERT(config_height >= 0); // negatives not allowed, if it's set :) if(config_width > 0) { int desired = m_rScreen.left + config_width; //int max_possible = m_rScreen.right; // disabled check until I get dual monitor working. or should I allow off screen captures anyway? //if(desired < max_possible) m_rScreen.right = desired; //else // m_rScreen.right = max_possible; } else { // leave full screen } m_iCaptureConfigWidth = m_rScreen.right - m_rScreen.left; ASSERT(m_iCaptureConfigWidth > 0); if(config_height > 0) { int desired = m_rScreen.top + config_height; //int max_possible = m_rScreen.bottom; // disabled, see above. //if(desired < max_possible) m_rScreen.bottom = desired; //else // m_rScreen.bottom = max_possible; } else { // leave full screen } m_iCaptureConfigHeight = m_rScreen.bottom - m_rScreen.top; ASSERT(m_iCaptureConfigHeight > 0); m_iStretchToThisConfigWidth = read_config_setting(TEXT("stretch_to_width"), 0); m_iStretchToThisConfigHeight = read_config_setting(TEXT("stretch_to_height"), 0); m_iStretchMode = read_config_setting(TEXT("stretch_mode_high_quality_if_1"), 0); ASSERT(m_iStretchToThisConfigWidth >= 0 && m_iStretchToThisConfigHeight >= 0 && m_iStretchMode >= 0); // sanity checks // default 30 fps...hmm... int config_max_fps = read_config_setting(TEXT("default_max_fps"), 30); // TODO allow floats [?] when ever requested ASSERT(config_max_fps >= 0); // m_rtFrameLength is also re-negotiated later... m_rtFrameLength = UNITS / config_max_fps; if(is_config_set_to_1(TEXT("track_new_x_y_coords_each_frame_if_1"))) { m_bReReadRegistry = 1; // takes 0.416880ms, but I thought it took more when I made it off by default :P } if(is_config_set_to_1(TEXT("dedup_if_1"))) { m_bDeDupe = 1; // takes 10 or 20ms...but useful to me! :) } m_millisToSleepBeforePollForChanges = read_config_setting(TEXT("millis_to_sleep_between_poll_for_dedupe_changes"), 10); wchar_t out[1000]; swprintf(out, 1000, L"default/from reg read config as: %dx%d -> %dx%d (%dtop %db %dl %dr) %dfps, dedupe? %d, millis between dedupe polling %d, m_bReReadRegistry? %d \n", m_iCaptureConfigHeight, m_iCaptureConfigWidth, getCaptureDesiredFinalHeight(), getCaptureDesiredFinalWidth(), m_rScreen.top, m_rScreen.bottom, m_rScreen.left, m_rScreen.right, config_max_fps, m_bDeDupe, m_millisToSleepBeforePollForChanges, m_bReReadRegistry); LocalOutput(out); // warmup for the below debug :) __int64 measureDebugOutputSpeed = StartCounter(); LocalOutput(out); LocalOutput("writing a large-ish debug itself took: %.0Lf ms", GetCounterSinceStartMillis(measureDebugOutputSpeed)); // does this work with flash? set_config_string_setting(L"last_init_config_was", out); }
HDC W32HandleDibDrv (PVPVOID vpbmi16) { HDC hdcMem = NULL; HBITMAP hbm = NULL; PVOID pvBits, pvIntelBits; STACKBMI32 bmi32; LPBITMAPINFO lpbmi32; DWORD dwClrUsed,nSize,nAlignmentSpace; PBITMAPINFOHEADER16 pbmi16; INT nbmiSize,nBytesWritten; HANDLE hfile=NULL,hsec=NULL; ULONG RetVal,OriginalSelLimit,SelectorLimit,OriginalFlags; PARM16 Parm16; CHAR pchTempFile[MAX_PATH]; BOOL bRet = FALSE; PVPVOID vpBase16 = (PVPVOID) ((ULONG) vpbmi16 & 0xffff0000); if ((hdcMem = W32FindAndLockDibInfo((USHORT)HIWORD(vpbmi16))) != (HDC)NULL) { return hdcMem; } // First create a memory device context compatible to // the app's current screen if ((hdcMem = CreateCompatibleDC (NULL)) == NULL) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv CreateCompatibleDC failed\n")); return NULL; } // Copy bmi16 to bmi32. DIB.DRV only supports DIB_RGB_COLORS lpbmi32 = CopyBMI16ToBMI32( vpbmi16, (LPBITMAPINFO)&bmi32, (WORD) DIB_RGB_COLORS); // this hack for Director 4.0 does essentially what WFW does // if this bitmap is 0 sized, just return an hDC for something simple if(bmi32.bmiHeader.biSizeImage == 0 && (CURRENTPTD()->dwWOWCompatFlagsEx & WOWCFEX_DIBDRVIMAGESIZEZERO)) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv:Zero biSizeImage, returning memory DC!\n")); return hdcMem; } try { // Copy the wholething into a temp file. First get a temp file name if ((nSize = GetTempPath (MAX_PATH, pchTempFile)) == 0 || nSize >= MAX_PATH) goto hdd_err; if (GetTempFileName (pchTempFile, "DIB", 0, pchTempFile) == 0) goto hdd_err; if ((hfile = CreateFile (pchTempFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, (FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE), NULL)) == INVALID_HANDLE_VALUE) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv CreateFile failed\n")); goto hdd_err; } // call back to get the size of the global object // associated with vpbmi16 Parm16.WndProc.wParam = HIWORD(vpbmi16); CallBack16(RET_GETDIBSIZE, &Parm16, 0, (PVPVOID)&SelectorLimit); Parm16.WndProc.wParam = HIWORD(vpbmi16); if (SelectorLimit == 0xffffffff || SelectorLimit == 0) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv Invalid Selector %x\n",HIWORD(vpbmi16))); goto hdd_err; } SelectorLimit++; OriginalSelLimit = SelectorLimit; CallBack16(RET_GETDIBFLAGS, &Parm16, 0, (PVPVOID)&OriginalFlags); if (OriginalFlags == 0x4) { //GA_DGROUP LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv GA_DGROUP Not Handled\n")); goto hdd_err; } GETVDMPTR(vpBase16, SelectorLimit, pbmi16); nbmiSize = GetBMI16Size(vpbmi16, (WORD) DIB_RGB_COLORS, &dwClrUsed); // Under NT CreateDIBSection will fail if the offset to the bits // is not dword aligned. So we may have to add some space at the top // of the section to get the offset correctly aligned. nAlignmentSpace = (nbmiSize+LOWORD(vpbmi16)) % 4; if (nAlignmentSpace) { if (WriteFile (hfile, pbmi16, nAlignmentSpace, &nBytesWritten, NULL) == FALSE || nBytesWritten != (INT) nAlignmentSpace) goto hdd_err; } // // detect a clinical case of bitedit screwing around dib.drv // // code below is using dib macros declared in wdib.h // namely: // DibNumColors - yields max number of colors in dib // DibColors - yields pointer to a dib color table // // Function W32CheckDibColorIndices checks to see if DIB color // table looks like a number (defined usually by biClrImportant) // of WORD indices in a sequential order (0, 1, 2, ...) // if this is the case, app is trying to use undocumented feature // of DIB.DRV that turns color matching off in this case. // Since we cannot enforce that rule, we approximate it by filling // color table by a number of known (and always same) entries // When blitting occurs, no color matching will be performed (when // both target and destination are of this very nature). // For no reason at all we fill color table with vga colors. // Sequential indices could have worked just as well. // // Modifications are made to memory pointed to by lpbmi32 if (W32CheckDibColorIndices((LPBITMAPINFOHEADER)lpbmi32)) { INT i, nColors; LPBITMAPINFOHEADER lpbmi = (LPBITMAPINFOHEADER)lpbmi32; LPRGBQUAD lprgbq = (LPRGBQUAD)DibColors(lpbmi); nColors = DibNumColors(lpbmi); lpbmi->biClrImportant = nColors; switch (lpbmi->biBitCount) { case 1: lprgbq[0] = rgbVGA[0]; lprgbq[1] = rgbVGA[0x0f]; break; case 4: RtlCopyMemory(lprgbq, rgbVGA, sizeof(rgbVGA)); break; case 8: RtlCopyMemory(lprgbq, rgbVGA, 8*sizeof(RGBQUAD)); RtlCopyMemory(lprgbq+248, rgbVGA+8, 8*sizeof(RGBQUAD)); RtlCopyMemory(lprgbq+8, rgb4, 2*sizeof(RGBQUAD)); RtlCopyMemory(lprgbq+246, rgb4+2, 2*sizeof(RGBQUAD)); for (i = 10; i < 246; ++i) { lprgbq[i].rgbBlue = i; lprgbq[i].rgbGreen= 0; lprgbq[i].rgbRed = 0; lprgbq[i].rgbReserved = 0; } break; default: // this should never happen break; } } if (WriteFile (hfile, pbmi16, SelectorLimit, &nBytesWritten, NULL) == FALSE || nBytesWritten != (INT) SelectorLimit) goto hdd_err; if (SelectorLimit < 64*1024) { if (SetFilePointer (hfile, 64*1024+nAlignmentSpace, NULL, FILE_BEGIN) == -1) goto hdd_err; if (SetEndOfFile (hfile) == FALSE) goto hdd_err; SelectorLimit = 64*1024; } if ((hsec = CreateFileMapping (hfile, NULL, PAGE_READWRITE | SEC_COMMIT, 0, SelectorLimit+nAlignmentSpace, NULL)) == NULL) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv CreateFileMapping Failed\n")); goto hdd_err; } // Now create the DIB section if ((hbm = CreateDIBSection (hdcMem, lpbmi32, DIB_RGB_COLORS, &pvBits, hsec, nAlignmentSpace + LOWORD(vpbmi16) + nbmiSize )) == NULL) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv CreateDibSection Failed\n")); goto hdd_err; } FREEVDMPTR(pbmi16); if((pvBits = MapViewOfFile(hsec, FILE_MAP_WRITE, 0, 0, SelectorLimit+nAlignmentSpace)) == NULL) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv MapViewOfFile Failed\n")); goto hdd_err; } pvBits = (PVOID) ((ULONG)pvBits + nAlignmentSpace); SelectObject (hdcMem, hbm); GdiSetBatchLimit(1); #ifndef i386 if (!NT_SUCCESS(VdmAddVirtualMemory((ULONG)pvBits, (ULONG)SelectorLimit, (PULONG)&pvIntelBits))) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv VdmAddVirtualMemory failed\n")); goto hdd_err; } // On risc platforms, the intel base + the intel linear address // of the DIB section is not equal to the DIB section's process // address. This is because of the VdmAddVirtualMemory call // above. So here we zap the correct address into the flataddress // array. if (!VdmAddDescriptorMapping(HIWORD(vpbmi16), (USHORT) ((SelectorLimit+65535)/65536), (ULONG) pvIntelBits, (ULONG) pvBits)) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv VdmAddDescriptorMapping failed\n")); goto hdd_err; } #else pvIntelBits = pvBits; #endif // Finally set the selectors to the new DIB Parm16.WndProc.wParam = HIWORD(vpbmi16); Parm16.WndProc.lParam = (LONG)pvIntelBits; Parm16.WndProc.wMsg = 0x10; // GA_NOCOMPACT Parm16.WndProc.hwnd = 1; // set so it's not randomly 0 CallBack16(RET_SETDIBSEL, &Parm16, 0, (PVPVOID)&RetVal); if (!RetVal) { LOGDEBUG(LOG_ALWAYS,("\nWOW::W32HandleDibDrv Callback set_sel_for_dib failed\n")); goto hdd_err; } // Store all the relevant information so that DeleteDC could // free all the resources later. if (W32AddDibInfo(hdcMem, hfile, hsec, nAlignmentSpace, pvBits, pvIntelBits, hbm, OriginalSelLimit, (USHORT)OriginalFlags, (USHORT)((HIWORD(vpbmi16)))) == FALSE) goto hdd_err; // Finally spit out the dump for debugging LOGDEBUG(6,("\t\tWOW::W32HandleDibDrv hdc=%04x nAlignment=%04x\n\t\tNewDib=%x OldDib=%04x:%04x DibSize=%x DibFlags=%x\n",hdcMem,nAlignmentSpace,pvBits,HIWORD(vpbmi16),LOWORD(vpbmi16),OriginalSelLimit,(USHORT)OriginalFlags)); bRet = TRUE; hdd_err:; } finally { if (!bRet) { if (hdcMem) { DeleteDC (hdcMem); hdcMem = NULL; } if (hfile) CloseHandle (hfile); if (hsec) CloseHandle (hsec); if (hbm) CloseHandle (hbm); } } return hdcMem; }
ULONG FASTCALL WG32CreateDIBSection(PVDMFRAME pFrame) { ULONG ul = 0; STACKBMI32 bmi32; LPBITMAPINFO lpbmi32; HBITMAP hbm32; PVOID pv16, pvBits, pvIntelBits; PVPVOID vpbmi16; PVOID pvBits32; DWORD dwArg16; register PCREATEDIBSECTION16 parg16; GETARGPTR(pFrame, sizeof(CREATEDIBSECTION16), parg16); // this is performance hack so we don't generate extra code dwArg16 = FETCHDWORD(parg16->f4); // do it once here pv16 = (PVOID)GetPModeVDMPointer(dwArg16, sizeof(DWORD)); // aligned here! WOW32ASSERTMSG(((parg16->f5 == 0) && (parg16->f6 == 0)), ("WOW:WG32CreateDIBSection, hSection/dwOffset non-null\n")); vpbmi16 = (PVPVOID)FETCHDWORD(parg16->f2); lpbmi32 = CopyBMI16ToBMI32(vpbmi16, (LPBITMAPINFO)&bmi32, FETCHWORD(parg16->f3)); hbm32 = CreateDIBSection(HDC32(parg16->f1), lpbmi32, WORD32(parg16->f3), &pvBits, NULL, 0); if (hbm32 != 0) { PARM16 Parm16; PDIBSECTIONINFO pdi; ULONG SelectorLimit; SelectorLimit = (ULONG)cjBitmapBitsSize(lpbmi32); #ifndef i386 if (!NT_SUCCESS(VdmAddVirtualMemory((ULONG)pvBits, SelectorLimit, (PULONG)&pvIntelBits))) { LOGDEBUG(LOG_ALWAYS,("\nWOW::WG32CreateDibSection VdmAddVirtualMemory failed\n")); goto cds_err; } #else pvIntelBits = pvBits; #endif // Create a selector array for the bits backed by pvIntelBits Parm16.WndProc.wParam = (WORD)-1; // -1 => allocate selectors Parm16.WndProc.lParam = (LONG) pvIntelBits; // backing pointer Parm16.WndProc.wMsg = 0x10; // GA_NOCOMPACT Parm16.WndProc.hwnd = (WORD)((SelectorLimit+65535)/65536);// selector count CallBack16(RET_SETDIBSEL, &Parm16, 0, (PVPVOID)&pvBits32); // 16:16 pointer is still valid as call above makes no difference if (pv16 != NULL) { *(UNALIGNED PVOID*)pv16 = pvBits32; } if (pvBits32 == NULL) { LOGDEBUG(LOG_ALWAYS,("\nWOW::WG32CreateDibSection, Callback set_sel_for_dib failed\n")); goto cds_err; } #ifndef i386 // okay, that was successful - map the descriptors properly if (!VdmAddDescriptorMapping(HIWORD(pvBits32), (USHORT) ((SelectorLimit+65535)/65536), (ULONG) pvIntelBits, (ULONG) pvBits)) { LOGDEBUG(LOG_ALWAYS,("\nWOW::WG32CreateDibSection VdmAddDescriptorMapping failed\n")); goto cds_err; } #endif LOGDEBUG(LOG_ALWAYS, ("\nWOW:CreateDIBSection: [16:16 %x] [Intel %x] [Flat %x]\n", pvBits32, pvIntelBits, pvBits)); ul = GETHBITMAP16(hbm32); // Add it to the list used for cleanup at DeleteObject time. if ((pdi = malloc_w (sizeof (DIBSECTIONINFO))) != NULL) { pdi->di_hbm = (HBITMAP)(HAND16)hbm32; pdi->di_pv16 = pvBits32; #ifndef i386 pdi->di_newIntelDib = pvIntelBits; #endif pdi->di_next = pDibSectionInfoHead; pDibSectionInfoHead = pdi; // need to turn batching off since a DIBSECTION means the app can // also draw on the bitmap and we need synchronization. GdiSetBatchLimit(1); goto cds_ok; } else { // Failure, free the selector array Parm16.WndProc.wParam = (WORD)-1; // -1 => allocate/free Parm16.WndProc.lParam = (LONG) pvBits32; // pointer Parm16.WndProc.wMsg = 0x10; // GA_NOCOMPACT Parm16.WndProc.hwnd = 0; // 0 => free CallBack16(RET_SETDIBSEL, &Parm16, 0, (PVPVOID)&ul); #ifndef i386 VdmRemoveVirtualMemory((ULONG)pvIntelBits); #endif } } else { LOGDEBUG(LOG_ALWAYS,("\nWOW::WG32CreateDibSection, CreateDibSection Failed\n")); } cds_err: if (hbm32 != 0) { DeleteObject(hbm32); } LOGDEBUG(LOG_ALWAYS,("\nWOW::WG32CreateDibSection returning failure\n")); ul = 0; cds_ok: WOW32APIWARN(ul, "CreateDIBSection"); FREEMISCPTR(pv16); FREEARGPTR(parg16); return(ul); }