/* * PipeDlgQueryInfo * * Purpose: * * List pipes from pipe device. * */ VOID PipeDlgQueryInfo( VOID ) { BOOL cond = FALSE, cond2 = TRUE; BOOLEAN bRestartScan; HANDLE hObject = NULL; FILE_DIRECTORY_INFORMATION *DirectoryInfo = NULL; NTSTATUS status; OBJECT_ATTRIBUTES obja; UNICODE_STRING uStr; IO_STATUS_BLOCK iost; LVITEM lvitem; INT c; do { RtlSecureZeroMemory(&uStr, sizeof(uStr)); RtlInitUnicodeString(&uStr, T_DEVICE_NAMED_PIPE); InitializeObjectAttributes(&obja, &uStr, OBJ_CASE_INSENSITIVE, NULL, NULL); status = NtOpenFile(&hObject, FILE_LIST_DIRECTORY, &obja, &iost, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_SUPERSEDE); if (!NT_SUCCESS(status)) { break; } DirectoryInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 0x1000); if (DirectoryInfo == NULL) { break; } c = 0; bRestartScan = TRUE; while (cond2) { RtlSecureZeroMemory(&iost, sizeof(iost)); status = NtQueryDirectoryFile(hObject, NULL, NULL, NULL, &iost, DirectoryInfo, 0x1000, FileDirectoryInformation, TRUE, //ReturnSingleEntry NULL, bRestartScan //RestartScan ); if ( (!NT_SUCCESS(status)) || (!NT_SUCCESS(iost.Status)) || (iost.Information == 0) ) { break; } //Name RtlSecureZeroMemory(&lvitem, sizeof(lvitem)); lvitem.mask = LVIF_TEXT | LVIF_IMAGE; lvitem.pszText = DirectoryInfo->FileName; lvitem.iItem = MAXINT; ListView_InsertItem(PipeDlgContext.ListView, &lvitem); bRestartScan = FALSE; RtlSecureZeroMemory(DirectoryInfo, 0x1000); c++; if (c > 0x1000) {//its a trap break; } } } while (cond); if (DirectoryInfo != NULL) { HeapFree(GetProcessHeap(), 0, DirectoryInfo); } if (hObject) { NtClose(hObject); } }
/****************************************************************************** * CreateBitmapIndirect [[email protected]] * * Creates a bitmap with the specified info. * * PARAMS * bmp [I] Pointer to the bitmap info describing the bitmap * * RETURNS * Success: Handle to bitmap * Failure: NULL. Use GetLastError() to determine the cause. * * NOTES * If a width or height of 0 are given, a 1x1 monochrome bitmap is returned. */ HBITMAP WINAPI CreateBitmapIndirect( const BITMAP *bmp ) { BITMAP bm; BITMAPOBJ *bmpobj; HBITMAP hbitmap; if (!bmp || bmp->bmType) { SetLastError( ERROR_INVALID_PARAMETER ); return NULL; } if (bmp->bmWidth > 0x7ffffff || bmp->bmHeight > 0x7ffffff) { SetLastError( ERROR_INVALID_PARAMETER ); return 0; } bm = *bmp; if (!bm.bmWidth || !bm.bmHeight) { return GetStockObject( DEFAULT_BITMAP ); } else { if (bm.bmHeight < 0) bm.bmHeight = -bm.bmHeight; if (bm.bmWidth < 0) bm.bmWidth = -bm.bmWidth; } if (bm.bmPlanes != 1) { FIXME("planes = %d\n", bm.bmPlanes); SetLastError( ERROR_INVALID_PARAMETER ); return NULL; } /* Windows only uses 1, 4, 8, 16, 24 and 32 bpp */ if(bm.bmBitsPixel == 1) bm.bmBitsPixel = 1; else if(bm.bmBitsPixel <= 4) bm.bmBitsPixel = 4; else if(bm.bmBitsPixel <= 8) bm.bmBitsPixel = 8; else if(bm.bmBitsPixel <= 16) bm.bmBitsPixel = 16; else if(bm.bmBitsPixel <= 24) bm.bmBitsPixel = 24; else if(bm.bmBitsPixel <= 32) bm.bmBitsPixel = 32; else { WARN("Invalid bmBitsPixel %d, returning ERROR_INVALID_PARAMETER\n", bm.bmBitsPixel); SetLastError(ERROR_INVALID_PARAMETER); return NULL; } /* Windows ignores the provided bm.bmWidthBytes */ bm.bmWidthBytes = get_bitmap_stride( bm.bmWidth, bm.bmBitsPixel ); /* XP doesn't allow to create bitmaps larger than 128 Mb */ if (bm.bmHeight > 128 * 1024 * 1024 / bm.bmWidthBytes) { SetLastError( ERROR_NOT_ENOUGH_MEMORY ); return 0; } /* Create the BITMAPOBJ */ if (!(bmpobj = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*bmpobj) ))) { SetLastError( ERROR_NOT_ENOUGH_MEMORY ); return 0; } bmpobj->dib.dsBm = bm; bmpobj->dib.dsBm.bmBits = NULL; if (!(hbitmap = alloc_gdi_handle( bmpobj, OBJ_BITMAP, &bitmap_funcs ))) { HeapFree( GetProcessHeap(), 0, bmpobj ); return 0; } if (bm.bmBits) SetBitmapBits( hbitmap, bm.bmHeight * bm.bmWidthBytes, bm.bmBits ); TRACE("%dx%d, bpp %d planes %d: returning %p\n", bm.bmWidth, bm.bmHeight, bm.bmBitsPixel, bm.bmPlanes, hbitmap); return hbitmap; }
int WINAPI _tWinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { LPTSTR lpAppName, lpVersion, lpTitle; HWND hMainWnd; MSG Msg; BOOL bRet; int Ret = 1; size_t len; INITCOMMONCONTROLSEX icex; hInstance = hThisInstance; ProcessHeap = GetProcessHeap(); icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES; InitCommonControlsEx(&icex); if ( !AllocAndLoadString(&lpAppName, hInstance, IDS_APPNAME) || !AllocAndLoadString(&lpVersion, hInstance, IDS_VERSION) ) { return Ret; } len = _tcslen(lpAppName) + _tcslen(lpVersion); lpTitle = HeapAlloc(ProcessHeap, 0, (len + 2) * sizeof(TCHAR)); if (lpTitle == NULL) { LocalFree((HLOCAL)lpAppName); LocalFree((HLOCAL)lpVersion); return Ret; } wsprintf(lpTitle, _T("%s %s"), lpAppName, lpVersion); LocalFree((HLOCAL)lpAppName); LocalFree((HLOCAL)lpVersion); if (TbdInitImpl()) { if (InitMainWindowImpl()) { if (InitImageEditWindowImpl()) { if (InitFloatWndClass()) { hMainWnd = CreateMainWindow(lpTitle, nCmdShow); if (hMainWnd != NULL) { /* pump the message queue */ while ((bRet = GetMessage(&Msg, NULL, 0, 0) != 0)) { if (bRet != (BOOL)-1) { if (!MainWndTranslateMDISysAccel(hMainWnd, &Msg)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } } } Ret = 0; } UninitImageEditWindowImpl(); } UninitFloatWndImpl(); } UninitMainWindowImpl(); } TbdUninitImpl(); } HeapFree(GetProcessHeap(), 0, lpTitle); return Ret; }
static BOOL SaveIconResAsPNG(const BITMAPINFO *pIcon, const char *png_filename, LPCWSTR commentW) { static const char comment_key[] = "Created from"; FILE *fp; png_structp png_ptr; png_infop info_ptr; png_text comment; int nXORWidthBytes, nANDWidthBytes, color_type = 0, i, j; BYTE *row, *copy = NULL; const BYTE *pXOR, *pAND = NULL; int nWidth = pIcon->bmiHeader.biWidth; int nHeight = pIcon->bmiHeader.biHeight; int nBpp = pIcon->bmiHeader.biBitCount; switch (nBpp) { case 32: color_type |= PNG_COLOR_MASK_ALPHA; /* fall through */ case 24: color_type |= PNG_COLOR_MASK_COLOR; break; default: return FALSE; } if (!libpng_handle && !load_libpng()) { WINE_WARN("Unable to load libpng\n"); return FALSE; } if (!(fp = fopen(png_filename, "w"))) { WINE_ERR("unable to open '%s' for writing: %s\n", png_filename, strerror(errno)); return FALSE; } nXORWidthBytes = 4 * ((nWidth * nBpp + 31) / 32); nANDWidthBytes = 4 * ((nWidth + 31 ) / 32); pXOR = (const BYTE*) pIcon + sizeof(BITMAPINFOHEADER) + pIcon->bmiHeader.biClrUsed * sizeof(RGBQUAD); if (nHeight > nWidth) { nHeight /= 2; pAND = pXOR + nHeight * nXORWidthBytes; } /* Apply mask if present */ if (pAND) { RGBQUAD bgColor; /* copy bytes before modifying them */ copy = HeapAlloc( GetProcessHeap(), 0, nHeight * nXORWidthBytes ); memcpy( copy, pXOR, nHeight * nXORWidthBytes ); pXOR = copy; /* image and mask are upside down reversed */ row = copy + (nHeight - 1) * nXORWidthBytes; /* top left corner */ bgColor.rgbRed = row[0]; bgColor.rgbGreen = row[1]; bgColor.rgbBlue = row[2]; bgColor.rgbReserved = 0; for (i = 0; i < nHeight; i++, row -= nXORWidthBytes) for (j = 0; j < nWidth; j++, row += nBpp >> 3) if (MASK(j, i)) { RGBQUAD *pixel = (RGBQUAD *)row; pixel->rgbBlue = bgColor.rgbBlue; pixel->rgbGreen = bgColor.rgbGreen; pixel->rgbRed = bgColor.rgbRed; if (nBpp == 32) pixel->rgbReserved = bgColor.rgbReserved; } } comment.text = NULL; if (!(png_ptr = ppng_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) || !(info_ptr = ppng_create_info_struct(png_ptr))) goto error; if (setjmp(png_jmpbuf(png_ptr))) { /* All future errors jump here */ WINE_ERR("png error\n"); goto error; } ppng_init_io(png_ptr, fp); ppng_set_IHDR(png_ptr, info_ptr, nWidth, nHeight, 8, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); /* Set comment */ comment.compression = PNG_TEXT_COMPRESSION_NONE; comment.key = (png_charp)comment_key; i = WideCharToMultiByte(CP_UNIXCP, 0, commentW, -1, NULL, 0, NULL, NULL); comment.text = HeapAlloc(GetProcessHeap(), 0, i); WideCharToMultiByte(CP_UNIXCP, 0, commentW, -1, comment.text, i, NULL, NULL); comment.text_length = i - 1; ppng_set_text(png_ptr, info_ptr, &comment, 1); ppng_write_info(png_ptr, info_ptr); ppng_set_bgr(png_ptr); for (i = nHeight - 1; i >= 0 ; i--) ppng_write_row(png_ptr, (png_bytep)pXOR + nXORWidthBytes * i); ppng_write_end(png_ptr, info_ptr); ppng_destroy_write_struct(&png_ptr, &info_ptr); if (png_ptr) ppng_destroy_write_struct(&png_ptr, NULL); fclose(fp); HeapFree(GetProcessHeap(), 0, copy); HeapFree(GetProcessHeap(), 0, comment.text); return TRUE; error: if (png_ptr) ppng_destroy_write_struct(&png_ptr, NULL); fclose(fp); unlink(png_filename); HeapFree(GetProcessHeap(), 0, copy); HeapFree(GetProcessHeap(), 0, comment.text); return FALSE; }
/* DG_CONTROL/DAT_IDENTITY/MSG_OPENDS */ TW_UINT16 TWAIN_OpenDS (pTW_IDENTITY pOrigin, TW_MEMREF pData) { TW_UINT16 i = 0; pTW_IDENTITY pIdentity = (pTW_IDENTITY) pData; activeDS *newSource; const char *modname = NULL; HMODULE hmod; TRACE("DG_CONTROL/DAT_IDENTITY/MSG_OPENDS\n"); TRACE("pIdentity is %s\n", pIdentity->ProductName); if (DSM_currentState != 3) { FIXME("seq error\n"); DSM_twCC = TWCC_SEQERROR; return TWRC_FAILURE; } twain_autodetect(); if (!nrdevices) { FIXME("no devs.\n"); DSM_twCC = TWCC_NODS; return TWRC_FAILURE; } if (pIdentity->ProductName[0] != '\0') { /* Make sure the source to be opened exists in the device list */ for (i = 0; i<nrdevices; i++) if (!strcmp (devices[i].identity.ProductName, pIdentity->ProductName)) break; if (i == nrdevices) i = 0; } /* else use the first device */ /* the source is found in the device list */ newSource = HeapAlloc (GetProcessHeap(), 0, sizeof (activeDS)); if (!newSource) { DSM_twCC = TWCC_LOWMEMORY; FIXME("Out of memory.\n"); return TWRC_FAILURE; } hmod = LoadLibraryA(devices[i].modname); if (!hmod) { ERR("Failed to load TWAIN Source %s\n", modname); DSM_twCC = TWCC_OPERATIONERROR; HeapFree(GetProcessHeap(), 0, newSource); return TWRC_FAILURE; } newSource->hmod = hmod; newSource->dsEntry = (DSENTRYPROC)GetProcAddress(hmod, "DS_Entry"); if (TWRC_SUCCESS != newSource->dsEntry (pOrigin, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, pIdentity)) { DSM_twCC = TWCC_OPERATIONERROR; HeapFree(GetProcessHeap(), 0, newSource); return TWRC_FAILURE; } /* Assign name and id for the opened data source */ pIdentity->Id = DSM_sourceId ++; /* add the data source to an internal active source list */ newSource->next = activeSources; newSource->identity.Id = pIdentity->Id; strcpy (newSource->identity.ProductName, pIdentity->ProductName); activeSources = newSource; DSM_twCC = TWCC_SUCCESS; return TWRC_SUCCESS; }
static DWORD WINAPI ProcessMsgThread(LPVOID lpParam) { IDirectMusicPerformance8Impl* This = lpParam; DWORD timeOut = INFINITE; MSG msg; HRESULT hr; REFERENCE_TIME rtCurTime; DMUS_PMSGItem* it = NULL; DMUS_PMSGItem* cur = NULL; DMUS_PMSGItem* it_next = NULL; while (TRUE) { DWORD dwDec = This->rtLatencyTime + This->dwBumperLength; if (timeOut > 0) MsgWaitForMultipleObjects(0, NULL, FALSE, timeOut, QS_POSTMESSAGE|QS_SENDMESSAGE|QS_TIMER); timeOut = INFINITE; EnterCriticalSection(&This->safe); hr = IDirectMusicPerformance8_GetTime(&This->IDirectMusicPerformance8_iface, &rtCurTime, NULL); if (FAILED(hr)) { goto outrefresh; } for (it = This->imm_head; NULL != it; ) { it_next = it->next; cur = ProceedMsg(This, it); HeapFree(GetProcessHeap(), 0, cur); it = it_next; } for (it = This->head; NULL != it && it->rtItemTime < rtCurTime + dwDec; ) { it_next = it->next; cur = ProceedMsg(This, it); HeapFree(GetProcessHeap(), 0, cur); it = it_next; } if (NULL != it) { timeOut = ( it->rtItemTime - rtCurTime ) + This->rtLatencyTime; } outrefresh: LeaveCriticalSection(&This->safe); while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)) { /** if hwnd we suppose that is a windows event ... */ if (NULL != msg.hwnd) { TranslateMessage(&msg); DispatchMessageA(&msg); } else { switch (msg.message) { case WM_QUIT: case PROCESSMSG_EXIT: goto outofthread; case PROCESSMSG_START: break; case PROCESSMSG_ADD: break; case PROCESSMSG_REMOVE: break; default: ERR("Unhandled message %u. Critical Path\n", msg.message); break; } } } /** here we should run a little of current AudioPath */ } outofthread: TRACE("(%p): Exiting\n", This); return 0; }
static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream, WICDecodeOptions cacheOptions) { PngDecoder *This = impl_from_IWICBitmapDecoder(iface); LARGE_INTEGER seek; HRESULT hr=S_OK; png_bytep *row_pointers=NULL; UINT image_size; UINT i; int color_type, bit_depth; png_bytep trans; int num_trans; png_uint_32 transparency; png_color_16p trans_values; jmp_buf jmpbuf; TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); EnterCriticalSection(&This->lock); /* initialize libpng */ This->png_ptr = ppng_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!This->png_ptr) { hr = E_FAIL; goto end; } This->info_ptr = ppng_create_info_struct(This->png_ptr); if (!This->info_ptr) { ppng_destroy_read_struct(&This->png_ptr, NULL, NULL); This->png_ptr = NULL; hr = E_FAIL; goto end; } This->end_info = ppng_create_info_struct(This->png_ptr); if (!This->info_ptr) { ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, NULL); This->png_ptr = NULL; hr = E_FAIL; goto end; } /* set up setjmp/longjmp error handling */ if (setjmp(jmpbuf)) { ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info); HeapFree(GetProcessHeap(), 0, row_pointers); This->png_ptr = NULL; hr = E_FAIL; goto end; } ppng_set_error_fn(This->png_ptr, jmpbuf, user_error_fn, user_warning_fn); /* seek to the start of the stream */ seek.QuadPart = 0; hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL); if (FAILED(hr)) goto end; /* set up custom i/o handling */ ppng_set_read_fn(This->png_ptr, pIStream, user_read_data); /* read the header */ ppng_read_info(This->png_ptr, This->info_ptr); /* choose a pixel format */ color_type = ppng_get_color_type(This->png_ptr, This->info_ptr); bit_depth = ppng_get_bit_depth(This->png_ptr, This->info_ptr); /* check for color-keyed alpha */ transparency = ppng_get_tRNS(This->png_ptr, This->info_ptr, &trans, &num_trans, &trans_values); if (transparency && color_type != PNG_COLOR_TYPE_PALETTE) { /* expand to RGBA */ if (color_type == PNG_COLOR_TYPE_GRAY) { if (bit_depth < 8) { #if HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 ppng_set_expand_gray_1_2_4_to_8(This->png_ptr); #else ppng_set_gray_1_2_4_to_8(This->png_ptr); #endif bit_depth = 8; } ppng_set_gray_to_rgb(This->png_ptr); } ppng_set_tRNS_to_alpha(This->png_ptr); color_type = PNG_COLOR_TYPE_RGB_ALPHA; } switch (color_type) { case PNG_COLOR_TYPE_GRAY: This->bpp = bit_depth; switch (bit_depth) { case 1: This->format = &GUID_WICPixelFormatBlackWhite; break; case 2: This->format = &GUID_WICPixelFormat2bppGray; break; case 4: This->format = &GUID_WICPixelFormat4bppGray; break; case 8: This->format = &GUID_WICPixelFormat8bppGray; break; case 16: This->format = &GUID_WICPixelFormat16bppGray; break; default: ERR("invalid grayscale bit depth: %i\n", bit_depth); hr = E_FAIL; goto end; } break; case PNG_COLOR_TYPE_GRAY_ALPHA: /* WIC does not support grayscale alpha formats so use RGBA */ ppng_set_gray_to_rgb(This->png_ptr); /* fall through */ case PNG_COLOR_TYPE_RGB_ALPHA: This->bpp = bit_depth * 4; switch (bit_depth) { case 8: ppng_set_bgr(This->png_ptr); This->format = &GUID_WICPixelFormat32bppBGRA; break; case 16: This->format = &GUID_WICPixelFormat64bppRGBA; break; default: ERR("invalid RGBA bit depth: %i\n", bit_depth); hr = E_FAIL; goto end; } break; case PNG_COLOR_TYPE_PALETTE: This->bpp = bit_depth; switch (bit_depth) { case 1: This->format = &GUID_WICPixelFormat1bppIndexed; break; case 2: This->format = &GUID_WICPixelFormat2bppIndexed; break; case 4: This->format = &GUID_WICPixelFormat4bppIndexed; break; case 8: This->format = &GUID_WICPixelFormat8bppIndexed; break; default: ERR("invalid indexed color bit depth: %i\n", bit_depth); hr = E_FAIL; goto end; } break; case PNG_COLOR_TYPE_RGB: This->bpp = bit_depth * 3; switch (bit_depth) { case 8: ppng_set_bgr(This->png_ptr); This->format = &GUID_WICPixelFormat24bppBGR; break; case 16: This->format = &GUID_WICPixelFormat48bppRGB; break; default: ERR("invalid RGB color bit depth: %i\n", bit_depth); hr = E_FAIL; goto end; } break; default: ERR("invalid color type %i\n", color_type); hr = E_FAIL; goto end; } /* read the image data */ This->width = ppng_get_image_width(This->png_ptr, This->info_ptr); This->height = ppng_get_image_height(This->png_ptr, This->info_ptr); This->stride = This->width * This->bpp; image_size = This->stride * This->height; This->image_bits = HeapAlloc(GetProcessHeap(), 0, image_size); if (!This->image_bits) { hr = E_OUTOFMEMORY; goto end; } row_pointers = HeapAlloc(GetProcessHeap(), 0, sizeof(png_bytep)*This->height); if (!row_pointers) { hr = E_OUTOFMEMORY; goto end; } for (i=0; i<This->height; i++) row_pointers[i] = This->image_bits + i * This->stride; ppng_read_image(This->png_ptr, row_pointers); HeapFree(GetProcessHeap(), 0, row_pointers); row_pointers = NULL; ppng_read_end(This->png_ptr, This->end_info); This->initialized = TRUE; end: LeaveCriticalSection(&This->lock); return hr; }
static void test_comboboxex(void) { HWND myHwnd = 0; LONG res = -1; COMBOBOXEXITEM cbexItem; static TCHAR first_item[] = {'F','i','r','s','t',' ','I','t','e','m',0}, second_item[] = {'S','e','c','o','n','d',' ','I','t','e','m',0}, third_item[] = {'T','h','i','r','d',' ','I','t','e','m',0}, middle_item[] = {'B','e','t','w','e','e','n',' ','F','i','r','s','t',' ','a','n','d',' ', 'S','e','c','o','n','d',' ','I','t','e','m','s',0}, replacement_item[] = {'B','e','t','w','e','e','n',' ','F','i','r','s','t',' ','a','n','d',' ', 'S','e','c','o','n','d',' ','I','t','e','m','s',0}, out_of_range_item[] = {'O','u','t',' ','o','f',' ','R','a','n','g','e',' ','I','t','e','m',0}; /* Allocate space for result */ textBuffer = HeapAlloc(GetProcessHeap(), 0, MAX_CHARS); /* Basic comboboxex test */ myHwnd = createComboEx(WS_BORDER | WS_VISIBLE | WS_CHILD | CBS_DROPDOWN); /* Add items onto the end of the combobox */ res = addItem(myHwnd, -1, first_item); ok(res == 0, "Adding simple item failed (%d)\n", res); res = addItem(myHwnd, -1, second_item); ok(res == 1, "Adding simple item failed (%d)\n", res); res = addItem(myHwnd, 2, third_item); ok(res == 2, "Adding simple item failed (%d)\n", res); res = addItem(myHwnd, 1, middle_item); ok(res == 1, "Inserting simple item failed (%d)\n", res); /* Add an item completely out of range */ res = addItem(myHwnd, 99, out_of_range_item); ok(res == -1, "Adding using out of range index worked unexpectedly (%d)\n", res); res = addItem(myHwnd, 5, out_of_range_item); ok(res == -1, "Adding using out of range index worked unexpectedly (%d)\n", res); /* Removed: Causes traps on Windows XP res = addItem(myHwnd, -2, "Out Of Range Item"); ok(res == -1, "Adding out of range worked unexpectedly (%ld)\n", res); */ /* Get an item completely out of range */ res = getItem(myHwnd, 99, &cbexItem); ok(res == 0, "Getting item using out of range index worked unexpectedly (%d, %s)\n", res, cbexItem.pszText); res = getItem(myHwnd, 4, &cbexItem); ok(res == 0, "Getting item using out of range index worked unexpectedly (%d, %s)\n", res, cbexItem.pszText); res = getItem(myHwnd, -2, &cbexItem); ok(res == 0, "Getting item using out of range index worked unexpectedly (%d, %s)\n", res, cbexItem.pszText); /* Get an item in range */ res = getItem(myHwnd, 0, &cbexItem); ok(res != 0, "Getting item using valid index failed unexpectedly (%d)\n", res); ok(strcmp(first_item, cbexItem.pszText) == 0, "Getting item returned wrong string (%s)\n", cbexItem.pszText); res = getItem(myHwnd, 1, &cbexItem); ok(res != 0, "Getting item using valid index failed unexpectedly (%d)\n", res); ok(strcmp(middle_item, cbexItem.pszText) == 0, "Getting item returned wrong string (%s)\n", cbexItem.pszText); res = getItem(myHwnd, 2, &cbexItem); ok(res != 0, "Getting item using valid index failed unexpectedly (%d)\n", res); ok(strcmp(second_item, cbexItem.pszText) == 0, "Getting item returned wrong string (%s)\n", cbexItem.pszText); res = getItem(myHwnd, 3, &cbexItem); ok(res != 0, "Getting item using valid index failed unexpectedly (%d)\n", res); ok(strcmp(third_item, cbexItem.pszText) == 0, "Getting item returned wrong string (%s)\n", cbexItem.pszText); /* Set an item completely out of range */ res = setItem(myHwnd, 99, replacement_item); ok(res == 0, "Setting item using out of range index worked unexpectedly (%d)\n", res); res = setItem(myHwnd, 4, replacement_item); ok(res == 0, "Setting item using out of range index worked unexpectedly (%d)\n", res); res = setItem(myHwnd, -2, replacement_item); ok(res == 0, "Setting item using out of range index worked unexpectedly (%d)\n", res); /* Set an item in range */ res = setItem(myHwnd, 0, replacement_item); ok(res != 0, "Setting first item failed (%d)\n", res); res = setItem(myHwnd, 3, replacement_item); ok(res != 0, "Setting last item failed (%d)\n", res); /* Remove items completely out of range (4 items in control at this point) */ res = delItem(myHwnd, -1); ok(res == CB_ERR, "Deleting using out of range index worked unexpectedly (%d)\n", res); res = delItem(myHwnd, 4); ok(res == CB_ERR, "Deleting using out of range index worked unexpectedly (%d)\n", res); /* Remove items in range (4 items in control at this point) */ res = delItem(myHwnd, 3); ok(res == 3, "Deleting using out of range index failed (%d)\n", res); res = delItem(myHwnd, 0); ok(res == 2, "Deleting using out of range index failed (%d)\n", res); res = delItem(myHwnd, 0); ok(res == 1, "Deleting using out of range index failed (%d)\n", res); res = delItem(myHwnd, 0); ok(res == 0, "Deleting using out of range index failed (%d)\n", res); /* Remove from an empty box */ res = delItem(myHwnd, 0); ok(res == CB_ERR, "Deleting using out of range index worked unexpectedly (%d)\n", res); /* Cleanup */ HeapFree(GetProcessHeap(), 0, textBuffer); DestroyWindow(myHwnd); }
static HRESULT WINAPI PngFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, UINT lineCount, UINT cbStride, UINT cbBufferSize, BYTE *pbPixels) { PngEncoder *This = impl_from_IWICBitmapFrameEncode(iface); png_byte **row_pointers=NULL; UINT i; jmp_buf jmpbuf; TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels); EnterCriticalSection(&This->lock); if (!This->frame_initialized || !This->width || !This->height || !This->format) { LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; } if (lineCount == 0 || lineCount + This->lines_written > This->height) { LeaveCriticalSection(&This->lock); return E_INVALIDARG; } /* set up setjmp/longjmp error handling */ if (setjmp(jmpbuf)) { LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, row_pointers); return E_FAIL; } ppng_set_error_fn(This->png_ptr, jmpbuf, user_error_fn, user_warning_fn); if (!This->info_written) { ppng_set_IHDR(This->png_ptr, This->info_ptr, This->width, This->height, This->format->bit_depth, This->format->color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); if (This->xres != 0.0 && This->yres != 0.0) { ppng_set_pHYs(This->png_ptr, This->info_ptr, (This->xres+0.0127) / 0.0254, (This->yres+0.0127) / 0.0254, PNG_RESOLUTION_METER); } ppng_write_info(This->png_ptr, This->info_ptr); if (This->format->remove_filler) ppng_set_filler(This->png_ptr, 0, PNG_FILLER_AFTER); if (This->format->swap_rgb) ppng_set_bgr(This->png_ptr); This->info_written = TRUE; } row_pointers = HeapAlloc(GetProcessHeap(), 0, lineCount * sizeof(png_byte*)); if (!row_pointers) { LeaveCriticalSection(&This->lock); return E_OUTOFMEMORY; } for (i=0; i<lineCount; i++) row_pointers[i] = pbPixels + cbStride * i; ppng_write_rows(This->png_ptr, row_pointers, lineCount); This->lines_written += lineCount; LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, row_pointers); return S_OK; }
static HRESULT WINAPI PngFrameEncode_WriteSource(IWICBitmapFrameEncode *iface, IWICBitmapSource *pIBitmapSource, WICRect *prc) { PngEncoder *This = impl_from_IWICBitmapFrameEncode(iface); HRESULT hr; WICRect rc; WICPixelFormatGUID guid; UINT stride; BYTE *pixeldata; TRACE("(%p,%p,%p)\n", iface, pIBitmapSource, prc); if (!This->frame_initialized || !This->width || !This->height) return WINCODEC_ERR_WRONGSTATE; if (!This->format) { hr = IWICBitmapSource_GetPixelFormat(pIBitmapSource, &guid); if (FAILED(hr)) return hr; hr = IWICBitmapFrameEncode_SetPixelFormat(iface, &guid); if (FAILED(hr)) return hr; } hr = IWICBitmapSource_GetPixelFormat(pIBitmapSource, &guid); if (FAILED(hr)) return hr; if (memcmp(&guid, This->format->guid, sizeof(GUID)) != 0) { /* FIXME: should use WICConvertBitmapSource to convert */ ERR("format %s unsupported\n", debugstr_guid(&guid)); return E_FAIL; } if (This->xres == 0.0 || This->yres == 0.0) { double xres, yres; hr = IWICBitmapSource_GetResolution(pIBitmapSource, &xres, &yres); if (FAILED(hr)) return hr; hr = IWICBitmapFrameEncode_SetResolution(iface, xres, yres); if (FAILED(hr)) return hr; } if (!prc) { UINT width, height; hr = IWICBitmapSource_GetSize(pIBitmapSource, &width, &height); if (FAILED(hr)) return hr; rc.X = 0; rc.Y = 0; rc.Width = width; rc.Height = height; prc = &rc; } if (prc->Width != This->width) return E_INVALIDARG; stride = (This->format->bpp * This->width + 7)/8; pixeldata = HeapAlloc(GetProcessHeap(), 0, stride * prc->Height); if (!pixeldata) return E_OUTOFMEMORY; hr = IWICBitmapSource_CopyPixels(pIBitmapSource, prc, stride, stride*prc->Height, pixeldata); if (SUCCEEDED(hr)) { hr = IWICBitmapFrameEncode_WritePixels(iface, prc->Height, stride, stride*prc->Height, pixeldata); } HeapFree(GetProcessHeap(), 0, pixeldata); return hr; }
//----------------------------------------------------------------------------- static void load_paths_to_exclude(LPCTSTR path) { //----------------------------------------------------------------------------- FILE * stream_p; wchar_t *get_result; size_t line_len; struct exclude_entry **link_p; struct exclude_entry * next_p; if (_wfopen_s(&stream_p, path, L"r, ccs=UTF-8")) { _wfopen_s(&error_file, error_path, L"w"); _wcserror_s(error_buffer, sizeof error_buffer/sizeof(wchar_t), errno); fwprintf( error_file, L"_wfopen(%s) failed: (%d) %s\n", path, errno, error_buffer ); fclose(error_file); ExitProcess(2); } link_p = &exclude_entry_list_p; while (1) { // create an exclude entry next_p = (struct exclude_entry *) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct exclude_entry) ); if (next_p == NULL){ report_error(L"HeapAlloc failed to allocate memory", GetLastError()); ExitProcess(203); } // read in the path to watch from config.txt get_result = \ fgetws(full_file_name, ARRAYSIZE(full_file_name), stream_p); if (NULL == get_result) { if (0 == ferror(stream_p)) { HeapFree(GetProcessHeap(), 0, next_p); break; } _wfopen_s(&error_file, error_path, L"w"); _wcserror_s( error_buffer, sizeof error_buffer/sizeof(wchar_t) , errno ); fwprintf( error_file, L"fgetws(%s) failed: (%d) %s\n", path, errno, error_buffer ); fclose(error_file); ExitProcess(2); } // clean out the newline, if there is one line_len = wcslen(full_file_name); if (line_len && full_file_name[line_len-1] == L'\n'){ full_file_name[line_len-1] = L'\0'; line_len--; } if (full_file_name[0] == L'\0') continue; next_p->dir_path_len = line_len; next_p->dir_path = (wchar_t *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (line_len + 1) * sizeof(wchar_t)); if (next_p->dir_path == NULL){ report_error(L"HeapAlloc failed to allocate memory", GetLastError()); ExitProcess(204); } wcsncpy_s(next_p->dir_path, line_len+1, full_file_name, line_len); // add this entry to the list *link_p = next_p; // point to the new entry's next pointer link_p = &(*link_p)->next_p; } // while(1) fclose(stream_p); } // load_paths_to_exclude
//----------------------------------------------------------------------------- static void load_paths_to_watch(LPCTSTR path, HANDLE completion_port_h) { //----------------------------------------------------------------------------- FILE * stream_p; wchar_t *get_result; HANDLE create_result; size_t line_len; struct watch_entry **link_p; struct watch_entry * next_p; if (_wfopen_s(&stream_p, path, L"r, ccs=UTF-8")) { _wfopen_s(&error_file, error_path, L"w"); _wcserror_s(error_buffer, ARRAYSIZE(error_buffer), errno); fwprintf( error_file, L"_wfopen(%s) failed: (%d) %s\n", path, errno, error_buffer ); fclose(error_file); ExitProcess(2); } link_p = &watch_entry_list_p; while (1) { // create a watch entry next_p = (struct watch_entry *) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct watch_entry) ); if (next_p == NULL){ report_error(L"HeapAlloc failed to allocate memory", GetLastError()); ExitProcess(200); } // read in the path to watch from config.txt get_result = \ fgetws(full_file_name, ARRAYSIZE(full_file_name), stream_p); if (NULL == get_result) { if (0 == ferror(stream_p)) { HeapFree(GetProcessHeap(), 0, next_p); break; } _wfopen_s(&error_file, error_path, L"w"); _wcserror_s( error_buffer, sizeof error_buffer/sizeof(wchar_t) , errno ); fwprintf( error_file, L"fgetws(%s) failed: (%d) %s\n", path, errno, error_buffer ); fclose(error_file); ExitProcess(2); } // clean out the newline, if there is one line_len = wcslen(full_file_name); if (line_len && full_file_name[line_len-1] == L'\n'){ full_file_name[line_len-1] = L'\0'; line_len--; } if (full_file_name[0] == L'\0') continue; next_p->dir_path_len = line_len; next_p->dir_path = (wchar_t *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (line_len + 1) * sizeof(wchar_t)); if (next_p->dir_path == NULL){ report_error(L"HeapAlloc failed to allocate memory", GetLastError()); ExitProcess(201); } wcsncpy_s(next_p->dir_path, line_len+1, full_file_name, line_len); next_p->changes_buffer = (BYTE *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, CHANGES_BUFFER_SIZE); if (next_p->changes_buffer == NULL){ report_error(L"HeapAlloc failed to allocate memory", GetLastError()); ExitProcess(202); } // 2020-09-05 dougfort -- we don't clean out trailing slash here // because if they are backing up something like c:\\, we need // the trailing slash. This will come back to bite us when we are // checking for excludes // open a file handle to watch the directory in overlapped mode next_p->hDirectory = CreateFile( next_p->dir_path, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL ); // 2009-03-11 dougfort -- if we can't create this file, // assume it is a top-level directory // which no longer exists; so ignore it and move on. if (INVALID_HANDLE_VALUE == next_p->hDirectory) { report_error(L"CreateFile", GetLastError()); continue; } // add this file handle to the IO Complete port create_result = CreateIoCompletionPort( next_p->hDirectory, // FileHandle, completion_port_h, // ExistingCompletionPort, 0, // CompletionKey, 0 // NumberOfConcurrentThreads ); if (NULL == create_result) { report_error(L"CreateIOCompletionPort (add)", GetLastError()); ExitProcess(102); } if (create_result != completion_port_h) { ExitProcess(103); } start_watch(next_p); // add this entry to the list *link_p = next_p; // point to the new entry's next pointer link_p = &(*link_p)->next_p; } // while(1) fclose(stream_p); } // load_paths_to_watch
void SharedPortEndpoint::DoListenerAccept(ReliSock *return_remote_sock) { #ifdef WIN32 dprintf(D_FULLDEBUG, "SharedPortEndpoint: Entered DoListenerAccept Win32 path.\n"); ReliSock *remote_sock = return_remote_sock; if(!remote_sock) { remote_sock = new ReliSock; } EnterCriticalSection(&received_lock); if(!received_sockets.empty()) { WSAPROTOCOL_INFO *received_socket = received_sockets.front(); received_sockets.pop(); LeaveCriticalSection(&received_lock); remote_sock->assign(received_socket); remote_sock->enter_connected_state(); remote_sock->isClient(false); if(!return_remote_sock) daemonCore->HandleReqAsync(remote_sock); HeapFree(GetProcessHeap(), NULL, received_socket); } else { LeaveCriticalSection(&received_lock); dprintf(D_ALWAYS, "SharedPortEndpoint: DoListenerAccept: No connections, error.\n"); } #else ReliSock *accepted_sock = m_listener_sock.accept(); if( !accepted_sock ) { dprintf(D_ALWAYS, "SharedPortEndpoint: failed to accept connection on %s\n", m_full_name.Value()); return; } // Currently, instead of having daemonCore handle the command // for us, we read it here. This means we only support the raw // command protocol. accepted_sock->decode(); int cmd; if( !accepted_sock->get(cmd) ) { dprintf(D_ALWAYS, "SharedPortEndpoint: failed to read command on %s\n", m_full_name.Value()); delete accepted_sock; return; } if( cmd != SHARED_PORT_PASS_SOCK ) { dprintf(D_ALWAYS, "SharedPortEndpoint: received unexpected command %d (%s) on named socket %s\n", cmd, getCommandString(cmd), m_full_name.Value()); delete accepted_sock; return; } if( !accepted_sock->end_of_message() ) { dprintf(D_ALWAYS, "SharedPortEndpoint: failed to read end of message for cmd %s on %s\n", getCommandString(cmd), m_full_name.Value()); delete accepted_sock; return; } dprintf(D_COMMAND|D_FULLDEBUG, "SharedPortEndpoint: received command %d SHARED_PORT_PASS_SOCK on named socket %s\n", cmd, m_full_name.Value()); ReceiveSocket(accepted_sock,return_remote_sock); delete accepted_sock; #endif }
static void test_read(void) { HANDLE handle; BOOL ret; DWORD count, toread, read, needed; void *buf; SetLastError(0xdeadbeef); ret = ReadEventLogA(NULL, 0, 0, NULL, 0, NULL, NULL); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); read = 0xdeadbeef; SetLastError(0xdeadbeef); ret = ReadEventLogA(NULL, 0, 0, NULL, 0, &read, NULL); ok(!ret, "Expected failure\n"); ok(read == 0xdeadbeef, "Expected 'read' parameter to remain unchanged\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); needed = 0xdeadbeef; SetLastError(0xdeadbeef); ret = ReadEventLogA(NULL, 0, 0, NULL, 0, NULL, &needed); ok(!ret, "Expected failure\n"); ok(needed == 0xdeadbeef, "Expected 'needed' parameter to remain unchanged\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); /* 'read' and 'needed' are only filled when the needed buffer size is passed back or when the call succeeds */ SetLastError(0xdeadbeef); ret = ReadEventLogA(NULL, 0, 0, NULL, 0, &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = ReadEventLogA(NULL, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, NULL, 0, NULL, NULL); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = ReadEventLogA(NULL, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, NULL, 0, &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); buf = NULL; SetLastError(0xdeadbeef); ret = ReadEventLogA(NULL, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD)); SetLastError(0xdeadbeef); ret = ReadEventLogA(NULL, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); HeapFree(GetProcessHeap(), 0, buf); handle = OpenEventLogA(NULL, "Application"); /* Show that we need the proper dwFlags with a (for the rest) proper call */ buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD)); SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, 0, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, EVENTLOG_SEEK_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ | EVENTLOG_BACKWARDS_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, EVENTLOG_SEEK_READ | EVENTLOG_FORWARDS_READ | EVENTLOG_BACKWARDS_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, EVENTLOG_SEEK_READ | EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); HeapFree(GetProcessHeap(), 0, buf); /* First check if there are any records (in practice only on Wine: FIXME) */ count = 0; GetNumberOfEventLogRecords(handle, &count); if (!count) { skip("No records in the 'Application' log\n"); CloseEventLog(handle); return; } /* Get the buffer size for the first record */ buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD)); read = needed = 0xdeadbeef; SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); ok(!ret, "Expected failure\n"); ok(read == 0, "Expected no bytes read\n"); ok(needed > sizeof(EVENTLOGRECORD), "Expected the needed buffersize to be bigger than sizeof(EVENTLOGRECORD)\n"); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); /* Read the first record */ toread = needed; buf = HeapReAlloc(GetProcessHeap(), 0, buf, toread); read = needed = 0xdeadbeef; SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, toread, &read, &needed); ok(ret, "Expected success\n"); ok(read == toread || broken(read < toread), /* NT4 wants a buffer size way bigger than just 1 record */ "Expected the requested size to be read\n"); ok(needed == 0, "Expected no extra bytes to be read\n"); HeapFree(GetProcessHeap(), 0, buf); CloseEventLog(handle); }
int __cdecl main(void) { LPDHCP_POLICY pPolicy = NULL; // Policy structure DWORD dwError = ERROR_SUCCESS; // It stores the error code DWORD dwExprIdx = 0; // Expression Index DWORD dwOptionId = OPTION_USER_CLASS; // Option ID for UserClass DWORD dwSubOptionId = 0; // Sub Option ID for UserClass DWORD dwConditionIdx = 0; // Condition index which will be returned from DhcpHlprAddV4PolicyCondition DWORD dwBytesLength = 0; // Number of bytes of user data in pUserClassCondValueInBytes LPBYTE pUserClassCondValueInBytes = NULL; // Bytes containing condition value (user class based in the current example) DHCP_IP_ADDRESS dwSubnet = 0xa000000; // Subnet Address (10.0.0.0) LPWSTR pwszName = L"testPolicy"; //Name of the policy to be created LPWSTR pwszDescription = L"PolicyDescription"; // Description of the policy to be created char* szUserClassConditionValue = {"RRAS.Microsoft"}; // Default Routing and Remote Access Class DHCP_POL_LOGIC_OPER policyOperator = DhcpLogicalOr; // Root operator for the conditions and expressions DHCP_POL_ATTR_TYPE policyAttrType = DhcpAttrOption; // Policy attribute type DHCP_POL_COMPARATOR conditionOper = DhcpCompEqual; // Condition operator DHCP_IP_RANGE range = {0}; // Variable to hold range values DWORD dwStartAddress = 0xa00000a; //(10.0.0.10) Start Address of the range DWORD dwEndAddress = 0xa000032; //(10.0.0.50) End Address of the range range.StartAddress = dwStartAddress; range.EndAddress = dwEndAddress; // Invokes helper API to create/fill policy structure. dwError=DhcpHlprCreateV4Policy( pwszName, // Policy Name (dwSubnet == 0), // fGloabalPolicy, if scope is zero, this means it is a global policy else it is for a specific scope dwSubnet, // Scope 0, // Processing order policyOperator, // Logical operator, possible values are: DhcpLogicalOr, DhcpLogicalAnd pwszDescription, // Policy description TRUE, // Policy active or not &pPolicy // This is the actual structure that holds the policy ); if(ERROR_SUCCESS != dwError) { wprintf(L"DhcpHlprCreateV4Policy failed with Error = %d\n", dwError); goto cleanup; } // Fill in pUserClassCondValueInBytes and dwBytesLength dwBytesLength = (DWORD)strlen(szUserClassConditionValue); pUserClassCondValueInBytes = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesLength); if(NULL == pUserClassCondValueInBytes) { wprintf(L"Not Enough memory, HeapAllocFailed !!\n"); goto cleanup; } // Copies the bytes for condition values from pUserClassCondValueInBytes memcpy(pUserClassCondValueInBytes, szUserClassConditionValue, dwBytesLength); // Invokes helper API to create/fill the structure for adding conditions for the policy. // The condition in this case is "user class" equals "Default Routing and Remote Access Class" dwError = DhcpHlprAddV4PolicyCondition( pPolicy, // Policy where conditions need to be added dwExprIdx, // Parent expression index policyAttrType, // Policy attribute type, possible values can be: DhcpAttrHWAddr, DhcpAttrOption and DhcpAttrSubOption dwOptionId, // Option ID dwSubOptionId, // Sub Option ID NULL, // Vendor Name conditionOper, // Policy comparator operator pUserClassCondValueInBytes, // Condition values in bytes dwBytesLength, // Number of bytes in the condition value &dwConditionIdx // Condition index ); if(ERROR_SUCCESS != dwError) { wprintf(L"DhcpHlprAddV4PolicyCondition failed with Error = %d\n", dwError); goto cleanup; } // Helper class for adding policy ip range is invoked from below. dwError = DhcpHlprAddV4PolicyRange(pPolicy,&range); if(ERROR_SUCCESS != dwError) { wprintf(L"DhcpHlprAddV4PolicyRange failed with Error = %d\n",dwError); } cleanup: // Frees the variable holding the condition values in bytes if(NULL != pUserClassCondValueInBytes) { HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, pUserClassCondValueInBytes); pUserClassCondValueInBytes = NULL; } // Frees the variable holding the policy. if(NULL != pPolicy) { DhcpHlprFreeV4Policy(pPolicy); } return 0; }
static void test_readwrite(void) { HANDLE handle; PSID user; DWORD sidsize, count; BOOL ret, sidavailable; BOOL on_vista = FALSE; /* Used to indicate Vista, W2K8 or Win7 */ DWORD i; char *localcomputer = NULL; DWORD size; if (pCreateWellKnownSid) { sidsize = SECURITY_MAX_SID_SIZE; user = HeapAlloc(GetProcessHeap(), 0, sidsize); SetLastError(0xdeadbeef); pCreateWellKnownSid(WinInteractiveSid, NULL, user, &sidsize); sidavailable = TRUE; } else { win_skip("Skipping some SID related tests\n"); sidavailable = FALSE; user = NULL; } /* Write an event with an incorrect event type. This will fail on Windows 7 * but succeed on all others, hence it's not part of the struct. */ handle = OpenEventLogA(NULL, eventlogname); if (!handle) { /* Intermittently seen on NT4 when tests are run immediately after boot */ win_skip("Could not get a handle to the eventlog\n"); goto cleanup; } count = 0xdeadbeef; GetNumberOfEventLogRecords(handle, &count); if (count != 0) { /* Needed for W2K3 without a service pack */ win_skip("We most likely opened the Application eventlog\n"); CloseEventLog(handle); Sleep(2000); handle = OpenEventLogA(NULL, eventlogname); count = 0xdeadbeef; GetNumberOfEventLogRecords(handle, &count); if (count != 0) { win_skip("We didn't open our new eventlog\n"); CloseEventLog(handle); goto cleanup; } } SetLastError(0xdeadbeef); ret = ReportEventA(handle, 0x20, 0, 0, NULL, 0, 0, NULL, NULL); if (!ret && GetLastError() == ERROR_CRC) { win_skip("Win7 fails when using incorrect event types\n"); ret = ReportEventA(handle, 0, 0, 0, NULL, 0, 0, NULL, NULL); ok(ret, "Expected success : %d\n", GetLastError()); } else { void *buf; DWORD read, needed = 0; EVENTLOGRECORD *record; ok(ret, "Expected success : %d\n", GetLastError()); /* Needed to catch earlier Vista (with no ServicePack for example) */ buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD)); if (!(ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed)) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { buf = HeapReAlloc(GetProcessHeap(), 0, buf, needed); ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, needed, &read, &needed); } if (ret) { record = (EVENTLOGRECORD *)buf; /* Vista and W2K8 return EVENTLOG_SUCCESS, Windows versions before return * the written eventtype (0x20 in this case). */ if (record->EventType == EVENTLOG_SUCCESS) on_vista = TRUE; } HeapFree(GetProcessHeap(), 0, buf); } /* This will clear the eventlog. The record numbering for new * events however differs on Vista SP1+. Before Vista the first * event would be numbered 1, on Vista SP1+ it's higher as we already * had at least one event (more in case of multiple test runs without * a reboot). */ ClearEventLogA(handle, NULL); CloseEventLog(handle); /* Write a bunch of events while using different event sources */ for (i = 0; i < sizeof(read_write)/sizeof(read_write[0]); i++) { DWORD oldest; BOOL run_sidtests = read_write[i].evt_sid & sidavailable; /* We don't need to use RegisterEventSource to report events */ if (i % 2) handle = OpenEventLogA(NULL, read_write[i].evt_src); else handle = RegisterEventSourceA(NULL, read_write[i].evt_src); ok(handle != NULL, "Expected a handle\n"); SetLastError(0xdeadbeef); ret = ReportEventA(handle, read_write[i].evt_type, read_write[i].evt_cat, read_write[i].evt_id, run_sidtests ? user : NULL, read_write[i].evt_numstrings, 0, read_write[i].evt_strings, NULL); ok(ret, "Expected ReportEvent success : %d\n", GetLastError()); count = 0xdeadbeef; SetLastError(0xdeadbeef); ret = GetNumberOfEventLogRecords(handle, &count); ok(ret, "Expected GetNumberOfEventLogRecords success : %d\n", GetLastError()); todo_wine ok(count == (i + 1), "Expected %d records, got %d\n", i + 1, count); oldest = 0xdeadbeef; ret = GetOldestEventLogRecord(handle, &oldest); ok(ret, "Expected GetOldestEventLogRecord success : %d\n", GetLastError()); todo_wine ok(oldest == 1 || (oldest > 1 && oldest != 0xdeadbeef), /* Vista SP1+, W2K8 and Win7 */ "Expected oldest to be 1 or higher, got %d\n", oldest); if (oldest > 1 && oldest != 0xdeadbeef) on_vista = TRUE; SetLastError(0xdeadbeef); if (i % 2) ret = CloseEventLog(handle); else ret = DeregisterEventSource(handle); ok(ret, "Expected success : %d\n", GetLastError()); } handle = OpenEventLogA(NULL, eventlogname); count = 0xdeadbeef; ret = GetNumberOfEventLogRecords(handle, &count); ok(ret, "Expected success\n"); todo_wine ok(count == i, "Expected %d records, got %d\n", i, count); CloseEventLog(handle); if (count == 0) { skip("No events were written to the eventlog\n"); goto cleanup; } /* Report only once */ if (on_vista) skip("There is no DWORD alignment enforced for UserSid on Vista, W2K8 or Win7\n"); if (on_vista && pGetComputerNameExA) { /* New Vista+ behavior */ size = 0; SetLastError(0xdeadbeef); pGetComputerNameExA(ComputerNameDnsFullyQualified, NULL, &size); localcomputer = HeapAlloc(GetProcessHeap(), 0, size); pGetComputerNameExA(ComputerNameDnsFullyQualified, localcomputer, &size); } else { size = MAX_COMPUTERNAME_LENGTH + 1; localcomputer = HeapAlloc(GetProcessHeap(), 0, size); GetComputerNameA(localcomputer, &size); } /* Read all events from our created eventlog, one by one */ handle = OpenEventLogA(NULL, eventlogname); i = 0; for (;;) { void *buf; DWORD read, needed; EVENTLOGRECORD *record; char *sourcename, *computername; int k; char *ptr; BOOL run_sidtests = read_write[i].evt_sid & sidavailable; buf = HeapAlloc(GetProcessHeap(), 0, sizeof(EVENTLOGRECORD)); SetLastError(0xdeadbeef); ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, sizeof(EVENTLOGRECORD), &read, &needed); if (!ret && GetLastError() == ERROR_HANDLE_EOF) { HeapFree(GetProcessHeap(), 0, buf); break; } ok(!ret, "Expected failure\n"); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INVALID_PARAMETER, got %d\n",GetLastError()); buf = HeapReAlloc(GetProcessHeap(), 0, buf, needed); ret = ReadEventLogA(handle, EVENTLOG_SEQUENTIAL_READ | EVENTLOG_FORWARDS_READ, 0, buf, needed, &read, &needed); ok(ret, "Expected success: %d\n", GetLastError()); record = (EVENTLOGRECORD *)buf; ok(record->Length == read, "Expected %d, got %d\n", read, record->Length); ok(record->Reserved == 0x654c664c, "Expected 0x654c664c, got %d\n", record->Reserved); ok(record->RecordNumber == i + 1 || (on_vista && (record->RecordNumber > i + 1)), "Expected %d or higher, got %d\n", i + 1, record->RecordNumber); ok(record->EventID == read_write[i].evt_id, "Expected %d, got %d\n", read_write[i].evt_id, record->EventID); ok(record->EventType == read_write[i].evt_type, "Expected %d, got %d\n", read_write[i].evt_type, record->EventType); ok(record->NumStrings == read_write[i].evt_numstrings, "Expected %d, got %d\n", read_write[i].evt_numstrings, record->NumStrings); ok(record->EventCategory == read_write[i].evt_cat, "Expected %d, got %d\n", read_write[i].evt_cat, record->EventCategory); sourcename = (char *)((BYTE *)buf + sizeof(EVENTLOGRECORD)); ok(!lstrcmpA(sourcename, read_write[i].evt_src), "Expected '%s', got '%s'\n", read_write[i].evt_src, sourcename); computername = (char *)((BYTE *)buf + sizeof(EVENTLOGRECORD) + lstrlenA(sourcename) + 1); ok(!lstrcmpiA(computername, localcomputer), "Expected '%s', got '%s'\n", localcomputer, computername); /* Before Vista, UserSid was aligned on a DWORD boundary. Next to that if * no padding was actually required a 0 DWORD was still used for padding. No * application should be relying on the padding as we are working with offsets * anyway. */ if (!on_vista) { DWORD calculated_sidoffset = sizeof(EVENTLOGRECORD) + lstrlenA(sourcename) + 1 + lstrlenA(computername) + 1; /* We are already DWORD aligned, there should still be some padding */ if ((((UINT_PTR)buf + calculated_sidoffset) % sizeof(DWORD)) == 0) ok(*(DWORD *)((BYTE *)buf + calculated_sidoffset) == 0, "Expected 0\n"); ok((((UINT_PTR)buf + record->UserSidOffset) % sizeof(DWORD)) == 0, "Expected DWORD alignment\n"); } if (run_sidtests) { ok(record->UserSidLength == sidsize, "Expected %d, got %d\n", sidsize, record->UserSidLength); } else { ok(record->StringOffset == record->UserSidOffset, "Expected offsets to be the same\n"); ok(record->UserSidLength == 0, "Expected 0, got %d\n", record->UserSidLength); } ok(record->DataLength == 0, "Expected 0, got %d\n", record->DataLength); ptr = (char *)((BYTE *)buf + record->StringOffset); for (k = 0; k < record->NumStrings; k++) { ok(!lstrcmpA(ptr, two_strings[k]), "Expected '%s', got '%s'\n", two_strings[k], ptr); ptr += lstrlenA(ptr) + 1; } ok(record->Length == *(DWORD *)((BYTE *)buf + record->Length - sizeof(DWORD)), "Expected the closing DWORD to contain the length of the record\n"); HeapFree(GetProcessHeap(), 0, buf); i++; } CloseEventLog(handle); /* Test clearing a real eventlog */ handle = OpenEventLogA(NULL, eventlogname); SetLastError(0xdeadbeef); ret = ClearEventLogA(handle, NULL); ok(ret, "Expected success\n"); count = 0xdeadbeef; ret = GetNumberOfEventLogRecords(handle, &count); ok(ret, "Expected success\n"); ok(count == 0, "Expected an empty eventlog, got %d records\n", count); CloseEventLog(handle); cleanup: HeapFree(GetProcessHeap(), 0, localcomputer); HeapFree(GetProcessHeap(), 0, user); }
static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { PMAIN_WND_INFO Info; LRESULT Ret = 0; /* Get the window context */ Info = (PMAIN_WND_INFO)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (Info == NULL && msg != WM_CREATE) { goto HandleDefaultMessage; } switch(msg) { case WM_CREATE: { Info = (PMAIN_WND_INFO)(((LPCREATESTRUCT)lParam)->lpCreateParams); /* Initialize the main window context */ Info->hMainWnd = hwnd; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)Info); if (!InitMainWnd(Info)) SendMessage(hwnd, WM_CLOSE, 0, 0); /* Show the window */ ShowWindow(hwnd, Info->nCmdShow); } break; case WM_SETFOCUS: { if (Info->hTreeView != NULL) SetFocus(Info->hTreeView); } break; case WM_SIZE: { MainWndResize(Info, LOWORD(lParam), HIWORD(lParam)); } break; case WM_NOTIFY: { Ret = OnNotify(Info, lParam); } break; case WM_CONTEXTMENU: { OnContext(Info, lParam); } break; case WM_COMMAND: { MainWndCommand(Info, LOWORD(wParam), (HWND)lParam); goto HandleDefaultMessage; } case WM_MENUSELECT: { if (Info->hStatus != NULL) { if (!MainWndMenuHint(Info, LOWORD(wParam), MainMenuHintTable, sizeof(MainMenuHintTable) / sizeof(MainMenuHintTable[0]), IDS_HINT_BLANK)) { MainWndMenuHint(Info, LOWORD(wParam), SystemMenuHintTable, sizeof(SystemMenuHintTable) / sizeof(SystemMenuHintTable[0]), IDS_HINT_BLANK); } } } break; case WM_ENTERMENULOOP: { Info->InMenuLoop = TRUE; UpdateMainStatusBar(Info); break; } case WM_EXITMENULOOP: { Info->InMenuLoop = FALSE; UpdateMainStatusBar(Info); break; } case WM_CLOSE: { FreeDeviceStrings(Info->hTreeView); DestroyMenu(Info->hShortcutMenu); DestroyWindow(hwnd); } break; case WM_DESTROY: { HeapFree(ProcessHeap, 0, Info); SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); /* Break the message queue loop */ PostQuitMessage(0); } break; default: { HandleDefaultMessage: Ret = DefWindowProc(hwnd, msg, wParam, lParam); } break; } return Ret; }
void Unload(){ HOOK_CALL( 0x004018A0, 0x00401C8A ); // ReferencedPortraits HOOK_CALL( 0x004018A0, 0x00401E21 ); // ReferencedPortraits HOOK_CALL( 0x0041EC00, 0x0042A3C6 ); // PortraitShutdown HOOK_CALL( 0x0041EB40, 0x00428A1F ); // PortraitInit *((BYTE*)0x0041EE08) = 0x3F; // max head_db entries *((BYTE*)0x0041EC9B) = 0x3F; // max head_db entries memcpy( (void*)0x004184B0, "\x8B\x44\x24\x04\x8D", 5 ); memcpy( (void*)0x004184D0, "\x8B\x44\x24\x04\x8D", 5 ); memcpy( (void*)0x004184F0, "\x8B\x44\x24\x04\x8D", 5 ); memcpy( (void*)0x00418510, "\x56\x57\x66\x33\xF6", 5 ); memcpy( (void*)0x00418540, "\x8B\x44\x24\x04\x8D", 5 ); memcpy( (void*)0x0042B510, "\x81\xEC\x00\x01\x00", 5 ); memcpy( (void*)0x0042B600, "\xB8\x78\xEB\x4C\x00", 5 ); memcpy( (void*)0x0042B9E0, "\x81\xEC\x00\x01\x00", 5 ); *((DWORD*)0x004018DF) = 0x004CFBD0; // Portrait_First *((DWORD*)0x00401910) = 0x004D09E8; // Portrait_Last *((DWORD*)0x0041D3A5) = 0x004CEB78; // &(SpriteTable[0].loaded_index) *((DWORD*)0x0042459C) = 0x004CEB78; // &(SpriteTable[0].loaded_index) *((DWORD*)0x0042BD81) = 0x004CEB78; // &(SpriteTable[0].loaded_index) *((DWORD*)0x0042BEDD) = 0x004CEB78; // &(SpriteTable[0].loaded_index) *((DWORD*)0x0042E238) = 0x004CEB78; // &(SpriteTable[0].loaded_index) *((DWORD*)0x0042B705) = 0x004CEB78; // &(SpriteTable[0].loaded_index) *((DWORD*)0x0047FE01) = 0x004EBC88; // offset_table *((DWORD*)0x00526D24) = 0; // Loaded_Sprite_Array *((DWORD*)0x00526D2C) = 0; // Loaded_Banner_Array *((DWORD*)0x00409F11) = 0x004C0940; // troop_book_unit_pic *((DWORD*)0x00409F52) = 0x004C0940; // troop_book_unit_pic *((DWORD*)0x0040C0CC) = 0x004C0940; // troop_book_unit_pic *((DWORD*)0x0040C108) = 0x004C0940; // troop_book_unit_pic *((DWORD*)0x00409DE3) = 0x004C0A80; // troop_book_leader_pic *((DWORD*)0x0040BD24) = 0x004C0A80; // troop_book_leader_pic *((DWORD*)0x00409EC2) = 0x004E2640; // unit name *((DWORD*)0x0040B876) = 0x004E2640; // unit name *((DWORD*)0x0040BE4A) = 0x004E2640; // unit name *((DWORD*)0x0040C20F) = 0x004E2640; // unit name *((DWORD*)0x0040C461) = 0x004E2640; // unit name *((DWORD*)0x0040D213) = 0x004E2640; // unit name *((DWORD*)0x0040D9C3) = 0x004E2640; // unit name *((DWORD*)0x0041985C) = 0x004E2640; // unit name *((DWORD*)0x0041A5E4) = 0x004E2640; // unit name *((DWORD*)0x0041B1B0) = 0x004E2640; // unit name *((DWORD*)0x0041B4CA) = 0x004E2640; // unit name *((DWORD*)0x0042671A) = 0x004E2640; // unit name *((DWORD*)0x004286E1) = 0x004E2640; // unit name *((DWORD*)0x00409E63) = 0x004E2780; // unit_desc *((DWORD*)0x0040BDE0) = 0x004E2780; // unit_desc *((DWORD*)0x004099B5) = 0x004C0BC0; // small_banner_index *((DWORD*)0x00409DAD) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0040B83D) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0040BCE0) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0040C1D5) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0040C413) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0040D97C) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0040E1E9) = 0x004C0BC0; // small_banner_index *((DWORD*)0x004192A4) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0041981E) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0041A39E) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0041A5A6) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0041B172) = 0x004C0BC0; // small_banner_index *((DWORD*)0x0041B48C) = 0x004C0BC0; // small_banner_index *((DWORD*)0x00425B26) = 0x004C0BC0; // small_banner_index *((DWORD*)0x00426DEB) = 0x004C0BC0; // small_banner_index for( int i = 80; i < 180; i++ ){ if( troop_book_leader_pic[i] != NULL ){ HeapFree( GetProcessHeap(), 0, troop_book_leader_pic[i] ); troop_book_leader_pic[i] = NULL; } if( troop_book_unit_pic[i] != NULL ){ HeapFree( GetProcessHeap(), 0, troop_book_unit_pic[i] ); troop_book_unit_pic[i] = NULL; } if( troop_book_unit_desc[i] != NULL ){ HeapFree( GetProcessHeap(), 0, troop_book_unit_desc[i] ); troop_book_unit_desc[i] = NULL; } } }
/* create the volatile hardware registry keys */ static void create_hardware_registry_keys(void) { static const WCHAR SystemW[] = {'H','a','r','d','w','a','r','e','\\', 'D','e','s','c','r','i','p','t','i','o','n','\\', 'S','y','s','t','e','m',0}; static const WCHAR fpuW[] = {'F','l','o','a','t','i','n','g','P','o','i','n','t','P','r','o','c','e','s','s','o','r',0}; static const WCHAR cpuW[] = {'C','e','n','t','r','a','l','P','r','o','c','e','s','s','o','r',0}; static const WCHAR FeatureSetW[] = {'F','e','a','t','u','r','e','S','e','t',0}; static const WCHAR IdentifierW[] = {'I','d','e','n','t','i','f','i','e','r',0}; static const WCHAR ProcessorNameStringW[] = {'P','r','o','c','e','s','s','o','r','N','a','m','e','S','t','r','i','n','g',0}; static const WCHAR SysidW[] = {'A','T',' ','c','o','m','p','a','t','i','b','l','e',0}; static const WCHAR ARMSysidW[] = {'A','R','M',' ','p','r','o','c','e','s','s','o','r',' ','f','a','m','i','l','y',0}; static const WCHAR mhzKeyW[] = {'~','M','H','z',0}; static const WCHAR VendorIdentifierW[] = {'V','e','n','d','o','r','I','d','e','n','t','i','f','i','e','r',0}; static const WCHAR VenidIntelW[] = {'G','e','n','u','i','n','e','I','n','t','e','l',0}; /* static const WCHAR VenidAMDW[] = {'A','u','t','h','e','n','t','i','c','A','M','D',0}; */ static const WCHAR PercentDW[] = {'%','d',0}; static const WCHAR IntelCpuDescrW[] = {'x','8','6',' ','F','a','m','i','l','y',' ','%','d',' ','M','o','d','e','l',' ','%','d', ' ','S','t','e','p','p','i','n','g',' ','%','d',0}; static const WCHAR ARMCpuDescrW[] = {'A','R','M',' ','F','a','m','i','l','y',' ','%','d',' ','M','o','d','e','l',' ','%','d', ' ','R','e','v','i','s','i','o','n',' ','%','d',0}; static const WCHAR IntelCpuStringW[] = {'I','n','t','e','l','(','R',')',' ','P','e','n','t','i','u','m','(','R',')',' ','4',' ', 'C','P','U',' ','2','.','4','0','G','H','z',0}; unsigned int i; HKEY hkey, system_key, cpu_key, fpu_key; SYSTEM_CPU_INFORMATION sci; PROCESSOR_POWER_INFORMATION* power_info; ULONG sizeof_power_info = sizeof(PROCESSOR_POWER_INFORMATION) * NtCurrentTeb()->Peb->NumberOfProcessors; WCHAR idW[60]; NtQuerySystemInformation( SystemCpuInformation, &sci, sizeof(sci), NULL ); power_info = HeapAlloc( GetProcessHeap(), 0, sizeof_power_info ); if (power_info == NULL) return; if (NtPowerInformation( ProcessorInformation, NULL, 0, power_info, sizeof_power_info )) memset( power_info, 0, sizeof_power_info ); /*TODO: report 64bit processors properly*/ switch(sci.Architecture) { case PROCESSOR_ARCHITECTURE_ARM: case PROCESSOR_ARCHITECTURE_ARM64: sprintfW( idW, ARMCpuDescrW, sci.Level, HIBYTE(sci.Revision), LOBYTE(sci.Revision) ); break; default: case PROCESSOR_ARCHITECTURE_INTEL: sprintfW( idW, IntelCpuDescrW, sci.Level, HIBYTE(sci.Revision), LOBYTE(sci.Revision) ); break; } if (RegCreateKeyExW( HKEY_LOCAL_MACHINE, SystemW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &system_key, NULL )) { HeapFree( GetProcessHeap(), 0, power_info ); return; } switch(sci.Architecture) { case PROCESSOR_ARCHITECTURE_ARM: case PROCESSOR_ARCHITECTURE_ARM64: set_reg_value( system_key, IdentifierW, ARMSysidW ); break; default: case PROCESSOR_ARCHITECTURE_INTEL: set_reg_value( system_key, IdentifierW, SysidW ); break; } if (sci.Architecture == PROCESSOR_ARCHITECTURE_ARM || sci.Architecture == PROCESSOR_ARCHITECTURE_ARM64 || RegCreateKeyExW( system_key, fpuW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &fpu_key, NULL )) fpu_key = 0; if (RegCreateKeyExW( system_key, cpuW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &cpu_key, NULL )) cpu_key = 0; for (i = 0; i < NtCurrentTeb()->Peb->NumberOfProcessors; i++) { WCHAR numW[10]; sprintfW( numW, PercentDW, i ); if (!RegCreateKeyExW( cpu_key, numW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL )) { RegSetValueExW( hkey, FeatureSetW, 0, REG_DWORD, (BYTE *)&sci.FeatureSet, sizeof(DWORD) ); set_reg_value( hkey, IdentifierW, idW ); /*TODO; report ARM and AMD properly*/ set_reg_value( hkey, ProcessorNameStringW, IntelCpuStringW ); set_reg_value( hkey, VendorIdentifierW, VenidIntelW ); RegSetValueExW( hkey, mhzKeyW, 0, REG_DWORD, (BYTE *)&power_info[i].MaxMhz, sizeof(DWORD) ); RegCloseKey( hkey ); } if (sci.Architecture != PROCESSOR_ARCHITECTURE_ARM && sci.Architecture != PROCESSOR_ARCHITECTURE_ARM64 && !RegCreateKeyExW( fpu_key, numW, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL )) { set_reg_value( hkey, IdentifierW, idW ); RegCloseKey( hkey ); } } RegCloseKey( fpu_key ); RegCloseKey( cpu_key ); RegCloseKey( system_key ); HeapFree( GetProcessHeap(), 0, power_info ); }
static LRESULT CALLBACK MonthCalWndProc(IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam) { PMONTHCALWND infoPtr; LRESULT Ret = 0; infoPtr = (PMONTHCALWND)GetWindowLongPtrW(hwnd, 0); if (infoPtr == NULL && uMsg != WM_CREATE) { goto HandleDefaultMessage; } switch (uMsg) { #if MONTHCAL_CTRLBG != MONTHCAL_DISABLED_CTRLBG case WM_ERASEBKGND: Ret = !infoPtr->Enabled; break; #endif case WM_PAINT: case WM_PRINTCLIENT: { if (infoPtr->CellSize.cx != 0 && infoPtr->CellSize.cy != 0) { PAINTSTRUCT ps; HDC hDC; if (wParam != 0) { if (!GetUpdateRect(hwnd, &ps.rcPaint, TRUE)) { break; } hDC = (HDC)wParam; } else { hDC = BeginPaint(hwnd, &ps); if (hDC == NULL) { break; } } MonthCalPaint(infoPtr, hDC, &ps.rcPaint); if (wParam == 0) { EndPaint(hwnd, &ps); } } break; } case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: { WORD SelDay; SelDay = MonthCalPtToDay(infoPtr, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); if (SelDay != 0 && SelDay != infoPtr->Day) { MonthCalSetDate(infoPtr, SelDay, infoPtr->Month, infoPtr->Year); } /* Fall through */ } case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: { if (!infoPtr->HasFocus) { SetFocus(hwnd); } break; } case WM_KEYDOWN: { WORD NewDay = 0; switch (wParam) { case VK_UP: { if (infoPtr->Day > 7) { NewDay = infoPtr->Day - 7; } break; } case VK_DOWN: { if (infoPtr->Day + 7 <= MonthCalMonthLength(infoPtr->Month, infoPtr->Year)) { NewDay = infoPtr->Day + 7; } break; } case VK_LEFT: { if (infoPtr->Day > 1) { NewDay = infoPtr->Day - 1; } break; } case VK_RIGHT: { if (infoPtr->Day < MonthCalMonthLength(infoPtr->Month, infoPtr->Year)) { NewDay = infoPtr->Day + 1; } break; } } /* Update the selection */ if (NewDay != 0) { MonthCalSetDate(infoPtr, NewDay, infoPtr->Month, infoPtr->Year); } goto HandleDefaultMessage; } case WM_GETDLGCODE: { INT virtKey; virtKey = (lParam != 0 ? (INT)((LPMSG)lParam)->wParam : 0); switch (virtKey) { case VK_TAB: { /* Change the UI status */ SendMessageW(GetAncestor(hwnd, GA_PARENT), WM_CHANGEUISTATE, MAKEWPARAM(UIS_INITIALIZE, 0), 0); break; } } Ret |= DLGC_WANTARROWS; break; } case WM_SETFOCUS: { infoPtr->HasFocus = TRUE; MonthCalRepaintDay(infoPtr, infoPtr->Day); break; } case WM_KILLFOCUS: { infoPtr->HasFocus = FALSE; MonthCalRepaintDay(infoPtr, infoPtr->Day); break; } case WM_UPDATEUISTATE: { DWORD OldUIState; Ret = DefWindowProcW(hwnd, uMsg, wParam, lParam); OldUIState = infoPtr->UIState; switch (LOWORD(wParam)) { case UIS_SET: infoPtr->UIState |= HIWORD(wParam); break; case UIS_CLEAR: infoPtr->UIState &= ~HIWORD(wParam); break; } if (infoPtr->UIState != OldUIState) { MonthCalRepaintDay(infoPtr, infoPtr->Day); } break; } case MCCM_SETDATE: { WORD Day, Month, Year, DaysCount; Day = LOWORD(wParam); Month = HIWORD(wParam); Year = LOWORD(lParam); if (Day == (WORD)-1) Day = infoPtr->Day; if (Month == (WORD)-1) Month = infoPtr->Month; if (Year == (WORD)-1) Year = infoPtr->Year; DaysCount = MonthCalMonthLength(Month, Year); if (Day > DaysCount) Day = DaysCount; if (MonthCalValidDate(Day, Month, Year)) { if (Day != infoPtr->Day || Month != infoPtr->Month || Year != infoPtr->Year) { Ret = MonthCalSetDate(infoPtr, Day, Month, Year); } } break; } case MCCM_GETDATE: { LPSYSTEMTIME lpSystemTime = (LPSYSTEMTIME)wParam; lpSystemTime->wYear = infoPtr->Year; lpSystemTime->wMonth = infoPtr->Month; lpSystemTime->wDay = infoPtr->Day; Ret = TRUE; break; } case MCCM_RESET: { MonthCalSetLocalTime(infoPtr, NULL); Ret = TRUE; break; } case MCCM_CHANGED: { Ret = infoPtr->Changed; break; } case WM_TIMER: { switch (wParam) { case ID_DAYTIMER: { /* Kill the timer */ KillTimer(hwnd, ID_DAYTIMER); infoPtr->DayTimerSet = FALSE; if (!infoPtr->Changed) { /* Update the system time and setup the new day timer */ MonthCalSetLocalTime(infoPtr, NULL); /* Update the control */ MonthCalUpdate(infoPtr); } break; } } break; } case WM_SETFONT: { Ret = (LRESULT)MonthCalChangeFont(infoPtr, (HFONT)wParam, (BOOL)LOWORD(lParam)); break; } case WM_SIZE: { infoPtr->ClientSize.cx = LOWORD(lParam); infoPtr->ClientSize.cy = HIWORD(lParam); infoPtr->CellSize.cx = infoPtr->ClientSize.cx / 7; infoPtr->CellSize.cy = infoPtr->ClientSize.cy / 7; /* Repaint the control */ InvalidateRect(hwnd, NULL, TRUE); break; } case WM_GETFONT: { Ret = (LRESULT)infoPtr->hFont; break; } case WM_ENABLE: { infoPtr->Enabled = ((BOOL)wParam != FALSE); MonthCalReload(infoPtr); break; } case WM_STYLECHANGED: { if (wParam == GWL_STYLE) { unsigned int OldEnabled = infoPtr->Enabled; infoPtr->Enabled = !(((LPSTYLESTRUCT)lParam)->styleNew & WS_DISABLED); if (OldEnabled != infoPtr->Enabled) { MonthCalReload(infoPtr); } } break; } case WM_CREATE: { infoPtr = (MONTHCALWND*) HeapAlloc(GetProcessHeap(), 0, sizeof(MONTHCALWND)); if (infoPtr == NULL) { Ret = (LRESULT)-1; break; } SetWindowLongPtrW(hwnd, 0, (LONG_PTR)infoPtr); ZeroMemory(infoPtr, sizeof(MONTHCALWND)); infoPtr->hSelf = hwnd; infoPtr->hNotify = ((LPCREATESTRUCTW)lParam)->hwndParent; infoPtr->Enabled = !(((LPCREATESTRUCTW)lParam)->style & WS_DISABLED); MonthCalSetLocalTime(infoPtr, NULL); MonthCalReload(infoPtr); break; } case WM_DESTROY: { HeapFree(GetProcessHeap(), 0, infoPtr); SetWindowLongPtrW(hwnd, 0, (DWORD_PTR)NULL); break; } default: { HandleDefaultMessage: Ret = DefWindowProcW(hwnd, uMsg, wParam, lParam); break; } } return Ret; }
static BOOL pendingRename(void) { static const WCHAR ValueName[] = {'P','e','n','d','i','n','g', 'F','i','l','e','R','e','n','a','m','e', 'O','p','e','r','a','t','i','o','n','s',0}; static const WCHAR SessionW[] = { 'S','y','s','t','e','m','\\', 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', 'C','o','n','t','r','o','l','\\', 'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r',0}; WCHAR *buffer=NULL; const WCHAR *src=NULL, *dst=NULL; DWORD dataLength=0; HKEY hSession=NULL; DWORD res; WINE_TRACE("Entered\n"); if( (res=RegOpenKeyExW( HKEY_LOCAL_MACHINE, SessionW, 0, KEY_ALL_ACCESS, &hSession )) !=ERROR_SUCCESS ) { WINE_TRACE("The key was not found - skipping\n"); return TRUE; } res=RegQueryValueExW( hSession, ValueName, NULL, NULL /* The value type does not really interest us, as it is not truly a REG_MULTI_SZ anyways */, NULL, &dataLength ); if( res==ERROR_FILE_NOT_FOUND ) { /* No value - nothing to do. Great! */ WINE_TRACE("Value not present - nothing to rename\n"); res=TRUE; goto end; } if( res!=ERROR_SUCCESS ) { WINE_ERR("Couldn't query value's length (%d)\n", res ); res=FALSE; goto end; } buffer=HeapAlloc( GetProcessHeap(),0,dataLength ); if( buffer==NULL ) { WINE_ERR("Couldn't allocate %u bytes for the value\n", dataLength ); res=FALSE; goto end; } res=RegQueryValueExW( hSession, ValueName, NULL, NULL, (LPBYTE)buffer, &dataLength ); if( res!=ERROR_SUCCESS ) { WINE_ERR("Couldn't query value after successfully querying before (%u),\n" "please report to [email protected]\n", res); res=FALSE; goto end; } /* Make sure that the data is long enough and ends with two NULLs. This * simplifies the code later on. */ if( dataLength<2*sizeof(buffer[0]) || buffer[dataLength/sizeof(buffer[0])-1]!='\0' || buffer[dataLength/sizeof(buffer[0])-2]!='\0' ) { WINE_ERR("Improper value format - doesn't end with NULL\n"); res=FALSE; goto end; } for( src=buffer; (src-buffer)*sizeof(src[0])<dataLength && *src!='\0'; src=dst+lstrlenW(dst)+1 ) { DWORD dwFlags=0; WINE_TRACE("processing next command\n"); dst=src+lstrlenW(src)+1; /* We need to skip the \??\ header */ if( src[0]=='\\' && src[1]=='?' && src[2]=='?' && src[3]=='\\' ) src+=4; if( dst[0]=='!' ) { dwFlags|=MOVEFILE_REPLACE_EXISTING; dst++; } if( dst[0]=='\\' && dst[1]=='?' && dst[2]=='?' && dst[3]=='\\' ) dst+=4; if( *dst!='\0' ) { /* Rename the file */ MoveFileExW( src, dst, dwFlags ); } else { /* Delete the file or directory */ if (!RemoveDirectoryW( src ) && GetLastError() == ERROR_DIRECTORY) DeleteFileW( src ); } } if((res=RegDeleteValueW(hSession, ValueName))!=ERROR_SUCCESS ) { WINE_ERR("Error deleting the value (%u)\n", GetLastError() ); res=FALSE; } else res=TRUE; end: HeapFree(GetProcessHeap(), 0, buffer); if( hSession!=NULL ) RegCloseKey( hSession ); return res; }
static HRESULT WINAPI IDirectMusicPerformance8Impl_CreateStandardAudioPath(IDirectMusicPerformance8 *iface, DWORD dwType, DWORD dwPChannelCount, BOOL fActivate, IDirectMusicAudioPath **ppNewPath) { IDirectMusicPerformance8Impl *This = impl_from_IDirectMusicPerformance8(iface); IDirectMusicAudioPathImpl *default_path; IDirectMusicAudioPath *pPath; DSBUFFERDESC desc; WAVEFORMATEX format; LPDIRECTSOUNDBUFFER buffer; HRESULT hr = S_OK; FIXME("(%p)->(%d, %d, %d, %p): semi-stub\n", This, dwType, dwPChannelCount, fActivate, ppNewPath); if (NULL == ppNewPath) { return E_POINTER; } create_dmaudiopath(&IID_IDirectMusicAudioPath, (void**)&pPath); default_path = (IDirectMusicAudioPathImpl*)((char*)(pPath) - offsetof(IDirectMusicAudioPathImpl,AudioPathVtbl)); default_path->pPerf = &This->IDirectMusicPerformance8_iface; /* Secondary buffer description */ memset(&format, 0, sizeof(format)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = 1; format.nSamplesPerSec = 44000; format.nAvgBytesPerSec = 44000*2; format.nBlockAlign = 2; format.wBitsPerSample = 16; format.cbSize = 0; memset(&desc, 0, sizeof(desc)); desc.dwSize = sizeof(desc); desc.dwFlags = DSBCAPS_CTRLFX | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS; desc.dwBufferBytes = DSBSIZE_MIN; desc.dwReserved = 0; desc.lpwfxFormat = &format; desc.guid3DAlgorithm = GUID_NULL; switch(dwType) { case DMUS_APATH_DYNAMIC_3D: desc.dwFlags |= DSBCAPS_CTRL3D | DSBCAPS_CTRLFREQUENCY | DSBCAPS_MUTE3DATMAXDISTANCE; break; case DMUS_APATH_DYNAMIC_MONO: desc.dwFlags |= DSBCAPS_CTRLFREQUENCY; break; case DMUS_APATH_SHARED_STEREOPLUSREVERB: /* normally we have to create 2 buffers (one for music other for reverb) * in this case. See msdn */ case DMUS_APATH_DYNAMIC_STEREO: desc.dwFlags |= DSBCAPS_CTRLFREQUENCY; format.nChannels = 2; format.nBlockAlign *= 2; format.nAvgBytesPerSec *=2; break; default: HeapFree(GetProcessHeap(), 0, default_path); *ppNewPath = NULL; return E_INVALIDARG; } /* FIXME: Should we create one secondary buffer for each PChannel? */ hr = IDirectSound8_CreateSoundBuffer ((LPDIRECTSOUND8) This->pDirectSound, &desc, &buffer, NULL); if (FAILED(hr)) { HeapFree(GetProcessHeap(), 0, default_path); *ppNewPath = NULL; return DSERR_BUFFERLOST; } default_path->pDSBuffer = buffer; /* Update description for creating primary buffer */ desc.dwFlags |= DSBCAPS_PRIMARYBUFFER; desc.dwBufferBytes = 0; desc.lpwfxFormat = NULL; hr = IDirectSound8_CreateSoundBuffer ((LPDIRECTSOUND8) This->pDirectSound, &desc, &buffer, NULL); if (FAILED(hr)) { IDirectSoundBuffer_Release(default_path->pDSBuffer); HeapFree(GetProcessHeap(), 0, default_path); *ppNewPath = NULL; return DSERR_BUFFERLOST; } default_path->pPrimary = buffer; *ppNewPath = pPath; TRACE(" returning IDirectMusicAudioPath interface at %p.\n", *ppNewPath); return IDirectMusicAudioPath_Activate(*ppNewPath, fActivate); }
/* * Process a "Run" type registry key. * hkRoot is the HKEY from which "Software\Microsoft\Windows\CurrentVersion" is * opened. * szKeyName is the key holding the actual entries. * bDelete tells whether we should delete each value right before executing it. * bSynchronous tells whether we should wait for the prog to complete before * going on to the next prog. */ static BOOL ProcessRunKeys( HKEY hkRoot, LPCWSTR szKeyName, BOOL bDelete, BOOL bSynchronous ) { static const WCHAR WINKEY_NAME[]={'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n',0}; HKEY hkWin, hkRun; DWORD res, dispos; DWORD i, nMaxCmdLine=0, nMaxValue=0; WCHAR *szCmdLine=NULL; WCHAR *szValue=NULL; if (hkRoot==HKEY_LOCAL_MACHINE) WINE_TRACE("processing %s entries under HKLM\n",wine_dbgstr_w(szKeyName) ); else WINE_TRACE("processing %s entries under HKCU\n",wine_dbgstr_w(szKeyName) ); if (RegCreateKeyExW( hkRoot, WINKEY_NAME, 0, NULL, 0, KEY_READ, NULL, &hkWin, NULL ) != ERROR_SUCCESS) return TRUE; if ((res = RegCreateKeyExW( hkWin, szKeyName, 0, NULL, 0, bDelete ? KEY_ALL_ACCESS : KEY_READ, NULL, &hkRun, &dispos ) != ERROR_SUCCESS)) { RegCloseKey( hkWin ); return TRUE; } RegCloseKey( hkWin ); if (dispos == REG_CREATED_NEW_KEY) goto end; if( (res=RegQueryInfoKeyW( hkRun, NULL, NULL, NULL, NULL, NULL, NULL, &i, &nMaxValue, &nMaxCmdLine, NULL, NULL ))!=ERROR_SUCCESS ) goto end; if( i==0 ) { WINE_TRACE("No commands to execute.\n"); res=ERROR_SUCCESS; goto end; } if( (szCmdLine=HeapAlloc(GetProcessHeap(),0,nMaxCmdLine))==NULL ) { WINE_ERR("Couldn't allocate memory for the commands to be executed\n"); res=ERROR_NOT_ENOUGH_MEMORY; goto end; } if( (szValue=HeapAlloc(GetProcessHeap(),0,(++nMaxValue)*sizeof(*szValue)))==NULL ) { WINE_ERR("Couldn't allocate memory for the value names\n"); res=ERROR_NOT_ENOUGH_MEMORY; goto end; } while( i>0 ) { DWORD nValLength=nMaxValue, nDataLength=nMaxCmdLine; DWORD type; --i; if( (res=RegEnumValueW( hkRun, i, szValue, &nValLength, 0, &type, (LPBYTE)szCmdLine, &nDataLength ))!=ERROR_SUCCESS ) { WINE_ERR("Couldn't read in value %d - %d\n", i, res ); continue; } if( bDelete && (res=RegDeleteValueW( hkRun, szValue ))!=ERROR_SUCCESS ) { WINE_ERR("Couldn't delete value - %d, %d. Running command anyways.\n", i, res ); } if( type!=REG_SZ ) { WINE_ERR("Incorrect type of value #%d (%d)\n", i, type ); continue; } if( (res=runCmd(szCmdLine, NULL, bSynchronous, FALSE ))==INVALID_RUNCMD_RETURN ) { WINE_ERR("Error running cmd %s (%d)\n", wine_dbgstr_w(szCmdLine), GetLastError() ); } WINE_TRACE("Done processing cmd #%d\n", i); } res=ERROR_SUCCESS; end: HeapFree( GetProcessHeap(), 0, szValue ); HeapFree( GetProcessHeap(), 0, szCmdLine ); if( hkRun!=NULL ) RegCloseKey( hkRun ); WINE_TRACE("done\n"); return res==ERROR_SUCCESS; }
static void STDMETHODCALLTYPE d3d8_cubetexture_wined3d_object_destroyed(void *parent) { HeapFree(GetProcessHeap(), 0, parent); }
/* * WFP is Windows File Protection, in NT5 and Windows 2000 it maintains a cache * of known good dlls and scans through and replaces corrupted DLLs with these * known good versions. The only programs that should install into this dll * cache are Windows Updates and IE (which is treated like a Windows Update) * * Implementing this allows installing ie in win2k mode to actually install the * system dlls that we expect and need */ static int ProcessWindowsFileProtection(void) { static const WCHAR winlogonW[] = {'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s',' ','N','T','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'W','i','n','l','o','g','o','n',0}; static const WCHAR cachedirW[] = {'S','F','C','D','l','l','C','a','c','h','e','D','i','r',0}; static const WCHAR dllcacheW[] = {'\\','d','l','l','c','a','c','h','e','\\','*',0}; static const WCHAR wildcardW[] = {'\\','*',0}; WIN32_FIND_DATAW finddata; HANDLE find_handle; BOOL find_rc; DWORD rc; HKEY hkey; LPWSTR dllcache = NULL; if (!RegOpenKeyW( HKEY_LOCAL_MACHINE, winlogonW, &hkey )) { DWORD sz = 0; if (!RegQueryValueExW( hkey, cachedirW, 0, NULL, NULL, &sz)) { sz += sizeof(WCHAR); dllcache = HeapAlloc(GetProcessHeap(),0,sz + sizeof(wildcardW)); RegQueryValueExW( hkey, cachedirW, 0, NULL, (LPBYTE)dllcache, &sz); strcatW( dllcache, wildcardW ); } } RegCloseKey(hkey); if (!dllcache) { DWORD sz = GetSystemDirectoryW( NULL, 0 ); dllcache = HeapAlloc( GetProcessHeap(), 0, sz * sizeof(WCHAR) + sizeof(dllcacheW)); GetSystemDirectoryW( dllcache, sz ); strcatW( dllcache, dllcacheW ); } find_handle = FindFirstFileW(dllcache,&finddata); dllcache[ strlenW(dllcache) - 2] = 0; /* strip off wildcard */ find_rc = find_handle != INVALID_HANDLE_VALUE; while (find_rc) { static const WCHAR dotW[] = {'.',0}; static const WCHAR dotdotW[] = {'.','.',0}; WCHAR targetpath[MAX_PATH]; WCHAR currentpath[MAX_PATH]; UINT sz; UINT sz2; WCHAR tempfile[MAX_PATH]; if (strcmpW(finddata.cFileName,dotW) == 0 || strcmpW(finddata.cFileName,dotdotW) == 0) { find_rc = FindNextFileW(find_handle,&finddata); continue; } sz = MAX_PATH; sz2 = MAX_PATH; VerFindFileW(VFFF_ISSHAREDFILE, finddata.cFileName, windowsdir, windowsdir, currentpath, &sz, targetpath, &sz2); sz = MAX_PATH; rc = VerInstallFileW(0, finddata.cFileName, finddata.cFileName, dllcache, targetpath, currentpath, tempfile, &sz); if (rc != ERROR_SUCCESS) { WINE_WARN("WFP: %s error 0x%x\n",wine_dbgstr_w(finddata.cFileName),rc); DeleteFileW(tempfile); } /* now delete the source file so that we don't try to install it over and over again */ lstrcpynW( targetpath, dllcache, MAX_PATH - 1 ); sz = strlenW( targetpath ); targetpath[sz++] = '\\'; lstrcpynW( targetpath + sz, finddata.cFileName, MAX_PATH - sz ); if (!DeleteFileW( targetpath )) WINE_WARN( "failed to delete %s: error %u\n", wine_dbgstr_w(targetpath), GetLastError() ); find_rc = FindNextFileW(find_handle,&finddata); } FindClose(find_handle); HeapFree(GetProcessHeap(),0,dllcache); return 1; }
static HRESULT IDirectSoundCaptureBufferImpl_Create( DirectSoundCaptureDevice *device, IDirectSoundCaptureBufferImpl ** ppobj, LPCDSCBUFFERDESC lpcDSCBufferDesc) { LPWAVEFORMATEX wfex; IDirectSoundCaptureBufferImpl *This; TRACE( "(%p,%p,%p)\n", device, ppobj, lpcDSCBufferDesc); if (ppobj == NULL) { WARN("invalid parameter: ppobj == NULL\n"); return DSERR_INVALIDPARAM; } *ppobj = NULL; if (!device) { WARN("not initialized\n"); return DSERR_UNINITIALIZED; } if (lpcDSCBufferDesc == NULL) { WARN("invalid parameter: lpcDSCBufferDesc == NULL\n"); return DSERR_INVALIDPARAM; } if ( ((lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC)) && (lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC1))) || (lpcDSCBufferDesc->dwBufferBytes == 0) || (lpcDSCBufferDesc->lpwfxFormat == NULL) ) { /* FIXME: DSERR_BADFORMAT ? */ WARN("invalid lpcDSCBufferDesc\n"); return DSERR_INVALIDPARAM; } wfex = lpcDSCBufferDesc->lpwfxFormat; TRACE("(formattag=0x%04x,chans=%d,samplerate=%d," "bytespersec=%d,blockalign=%d,bitspersamp=%d,cbSize=%d)\n", wfex->wFormatTag, wfex->nChannels, wfex->nSamplesPerSec, wfex->nAvgBytesPerSec, wfex->nBlockAlign, wfex->wBitsPerSample, wfex->cbSize); device->pwfx = DSOUND_CopyFormat(wfex); if ( device->pwfx == NULL ) return DSERR_OUTOFMEMORY; This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(IDirectSoundCaptureBufferImpl)); if ( This == NULL ) { WARN("out of memory\n"); return DSERR_OUTOFMEMORY; } else { HRESULT err = DS_OK; LPBYTE newbuf; DWORD buflen; This->numIfaces = 0; This->ref = 0; This->refn = 0; This->device = device; This->device->capture_buffer = This; This->nrofnotifies = 0; This->pdscbd = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, lpcDSCBufferDesc->dwSize); if (This->pdscbd) CopyMemory(This->pdscbd, lpcDSCBufferDesc, lpcDSCBufferDesc->dwSize); else { WARN("no memory\n"); This->device->capture_buffer = 0; HeapFree( GetProcessHeap(), 0, This ); return DSERR_OUTOFMEMORY; } This->IDirectSoundCaptureBuffer8_iface.lpVtbl = &dscbvt; This->IDirectSoundNotify_iface.lpVtbl = &dscnvt; err = IMMDevice_Activate(device->mmdevice, &IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, (void**)&device->client); if(FAILED(err)){ WARN("Activate failed: %08x\n", err); HeapFree(GetProcessHeap(), 0, This->pdscbd); This->device->capture_buffer = 0; HeapFree( GetProcessHeap(), 0, This ); return err; } err = IAudioClient_Initialize(device->client, AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_NOPERSIST, 200 * 100000, 50000, device->pwfx, NULL); if(FAILED(err)){ WARN("Initialize failed: %08x\n", err); IAudioClient_Release(device->client); device->client = NULL; HeapFree(GetProcessHeap(), 0, This->pdscbd); This->device->capture_buffer = 0; HeapFree( GetProcessHeap(), 0, This ); if(err == AUDCLNT_E_UNSUPPORTED_FORMAT) return DSERR_BADFORMAT; return err; } err = IAudioClient_GetService(device->client, &IID_IAudioCaptureClient, (void**)&device->capture); if(FAILED(err)){ WARN("GetService failed: %08x\n", err); IAudioClient_Release(device->client); device->client = NULL; HeapFree(GetProcessHeap(), 0, This->pdscbd); This->device->capture_buffer = 0; HeapFree( GetProcessHeap(), 0, This ); return err; } buflen = lpcDSCBufferDesc->dwBufferBytes; TRACE("desired buflen=%d, old buffer=%p\n", buflen, device->buffer); if (device->buffer) newbuf = HeapReAlloc(GetProcessHeap(),0,device->buffer,buflen); else newbuf = HeapAlloc(GetProcessHeap(),0,buflen); if (newbuf == NULL) { IAudioClient_Release(device->client); device->client = NULL; IAudioCaptureClient_Release(device->capture); device->capture = NULL; HeapFree(GetProcessHeap(), 0, This->pdscbd); This->device->capture_buffer = 0; HeapFree( GetProcessHeap(), 0, This ); return DSERR_OUTOFMEMORY; } device->buffer = newbuf; device->buflen = buflen; } IDirectSoundCaptureBuffer_AddRef(&This->IDirectSoundCaptureBuffer8_iface); *ppobj = This; TRACE("returning DS_OK\n"); return DS_OK; }
/************************************************************************* * ICO_ExtractIconExW [internal] * * NOTES * nIcons = 0: returns number of Icons in file * * returns * invalid file: -1 * failure:0; * success: number of icons in file (nIcons = 0) or nr of icons retrieved */ static UINT ICO_ExtractIconExW( LPCWSTR lpszExeFileName, HICON * RetPtr, INT nIconIndex, UINT nIcons, UINT cxDesired, UINT cyDesired, UINT *pIconId, UINT flags) { UINT ret = 0; UINT cx1, cx2, cy1, cy2; LPBYTE pData; DWORD sig; HANDLE hFile; UINT16 iconDirCount = 0; //,iconCount = 0; LPBYTE peimage; HANDLE fmapping; DWORD fsizeh,fsizel; WCHAR szExePath[MAX_PATH]; DWORD dwSearchReturn; TRACE("%s, %d, %d %p 0x%08x\n", debugstr_w(lpszExeFileName), nIconIndex, nIcons, pIconId, flags); dwSearchReturn = SearchPathW(NULL, lpszExeFileName, NULL, sizeof(szExePath) / sizeof(szExePath[0]), szExePath, NULL); if ((dwSearchReturn == 0) || (dwSearchReturn > sizeof(szExePath) / sizeof(szExePath[0]))) { WARN("File %s not found or path too long\n", debugstr_w(lpszExeFileName)); return -1; } hFile = CreateFileW(szExePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (hFile == INVALID_HANDLE_VALUE) return ret; fsizel = GetFileSize(hFile,&fsizeh); /* Map the file */ fmapping = CreateFileMappingW(hFile, NULL, PAGE_READONLY | SEC_COMMIT, 0, 0, NULL); CloseHandle(hFile); if (!fmapping) { WARN("CreateFileMapping error %ld\n", GetLastError() ); return 0xFFFFFFFF; } if (!(peimage = MapViewOfFile(fmapping, FILE_MAP_READ, 0, 0, 0))) { WARN("MapViewOfFile error %ld\n", GetLastError() ); CloseHandle(fmapping); return 0xFFFFFFFF; } CloseHandle(fmapping); cx1 = LOWORD(cxDesired); cx2 = HIWORD(cxDesired); cy1 = LOWORD(cyDesired); cy2 = HIWORD(cyDesired); if (pIconId) /* Invalidate first icon identifier */ *pIconId = 0xFFFFFFFF; if (!pIconId) /* if no icon identifier array present use the icon handle array as intermediate storage */ pIconId = (UINT*)RetPtr; sig = USER32_GetResourceTable(peimage, fsizel, &pData); /* ico file or NE exe/dll*/ #if 0 if (sig==IMAGE_OS2_SIGNATURE || sig==1) /* .ICO file */ { BYTE *pCIDir = 0; NE_TYPEINFO *pTInfo = (NE_TYPEINFO*)(pData + 2); NE_NAMEINFO *pIconStorage = NULL; NE_NAMEINFO *pIconDir = NULL; LPicoICONDIR lpiID = NULL; TRACE("-- OS2/icon Signature (0x%08lx)\n", sig); if (pData == (BYTE*)-1) { pCIDir = ICO_GetIconDirectory(peimage, &lpiID, &uSize); /* check for .ICO file */ if (pCIDir) { iconDirCount = 1; iconCount = lpiID->idCount; TRACE("-- icon found %p 0x%08lx 0x%08x 0x%08x\n", pCIDir, uSize, iconDirCount, iconCount); } } else while (pTInfo->type_id && !(pIconStorage && pIconDir)) { if (pTInfo->type_id == NE_RSCTYPE_GROUP_ICON) /* find icon directory and icon repository */ { iconDirCount = pTInfo->count; pIconDir = ((NE_NAMEINFO*)(pTInfo + 1)); TRACE("\tfound directory - %i icon families\n", iconDirCount); } if (pTInfo->type_id == NE_RSCTYPE_ICON) { iconCount = pTInfo->count; pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1)); TRACE("\ttotal icons - %i\n", iconCount); } pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO)); } if ((pIconStorage && pIconDir) || lpiID) /* load resources and create icons */ { if (nIcons == 0) { ret = iconDirCount; if (lpiID && pCIDir) /* *.ico file, deallocate heap pointer*/ HeapFree(GetProcessHeap(), 0, pCIDir); } else if (nIconIndex < iconDirCount) { UINT16 i, icon; if (nIcons > iconDirCount - nIconIndex) nIcons = iconDirCount - nIconIndex; for (i = 0; i < nIcons; i++) { /* .ICO files have only one icon directory */ if (lpiID == NULL) /* not *.ico */ pCIDir = USER32_LoadResource(peimage, pIconDir + i + nIconIndex, *(WORD*)pData, &uSize); pIconId[i] = LookupIconIdFromDirectoryEx(pCIDir, TRUE, (i & 1) ? cx2 : cx1, (i & 1) ? cy2 : cy1, flags); } if (lpiID && pCIDir) /* *.ico file, deallocate heap pointer*/ HeapFree(GetProcessHeap(), 0, pCIDir); for (icon = 0; icon < nIcons; icon++) { pCIDir = NULL; if (lpiID) pCIDir = ICO_LoadIcon(peimage, lpiID->idEntries + (int)pIconId[icon], &uSize); else for (i = 0; i < iconCount; i++) if (pIconStorage[i].id == ((int)pIconId[icon] | 0x8000) ) pCIDir = USER32_LoadResource(peimage, pIconStorage + i, *(WORD*)pData, &uSize); if (pCIDir) RetPtr[icon] = (HICON)CreateIconFromResourceEx(pCIDir, uSize, TRUE, 0x00030000, (icon & 1) ? cx2 : cx1, (icon & 1) ? cy2 : cy1, flags); else RetPtr[icon] = 0; } ret = icon; /* return number of retrieved icons */ } } } /* end ico file */ /* exe/dll */ else if( sig == IMAGE_NT_SIGNATURE ) #endif if( sig == IMAGE_NT_SIGNATURE ) { LPBYTE idata,igdata; PIMAGE_DOS_HEADER dheader; PIMAGE_NT_HEADERS pe_header; PIMAGE_SECTION_HEADER pe_sections; const IMAGE_RESOURCE_DIRECTORY *rootresdir,*iconresdir,*icongroupresdir; const IMAGE_RESOURCE_DATA_ENTRY *idataent,*igdataent; const IMAGE_RESOURCE_DIRECTORY_ENTRY *xresent; UINT i, j; dheader = (PIMAGE_DOS_HEADER)peimage; pe_header = (PIMAGE_NT_HEADERS)(peimage+dheader->e_lfanew); /* it is a pe header, USER32_GetResourceTable checked that */ pe_sections = (PIMAGE_SECTION_HEADER)(((char*)pe_header) + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + pe_header->FileHeader.SizeOfOptionalHeader); rootresdir = NULL; /* search for the root resource directory */ for (i=0;i<pe_header->FileHeader.NumberOfSections;i++) { if (pe_sections[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) continue; if (fsizel < pe_sections[i].PointerToRawData+pe_sections[i].SizeOfRawData) { FIXME("File %s too short (section is at %ld bytes, real size is %ld)\n", debugstr_w(lpszExeFileName), pe_sections[i].PointerToRawData+pe_sections[i].SizeOfRawData, fsizel ); goto end; } /* FIXME: doesn't work when the resources are not in a separate section */ if (pe_sections[i].VirtualAddress == pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress) { rootresdir = (PIMAGE_RESOURCE_DIRECTORY)(peimage+pe_sections[i].PointerToRawData); break; } } if (!rootresdir) { WARN("haven't found section for resource directory.\n"); goto end; /* failure */ } /* search for the group icon directory */ if (!(icongroupresdir = find_entry_by_id(rootresdir, LOWORD(RT_GROUP_ICON), rootresdir))) { WARN("No Icongroupresourcedirectory!\n"); goto end; /* failure */ } iconDirCount = icongroupresdir->NumberOfNamedEntries + icongroupresdir->NumberOfIdEntries; /* only number of icons requested */ if( !pIconId ) { ret = iconDirCount; goto end; /* success */ } if( nIconIndex < 0 ) { /* search resource id */ int n = 0; int iId = abs(nIconIndex); const IMAGE_RESOURCE_DIRECTORY_ENTRY* xprdeTmp = (const IMAGE_RESOURCE_DIRECTORY_ENTRY*)(icongroupresdir+1); while(n<iconDirCount && xprdeTmp) { if(xprdeTmp->Id == iId) { nIconIndex = n; break; } n++; xprdeTmp++; } if (nIconIndex < 0) { WARN("resource id %d not found\n", iId); goto end; /* failure */ } } else { /* check nIconIndex to be in range */ if (nIconIndex >= iconDirCount) { WARN("nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount); goto end; /* failure */ } } /* assure we don't get too much */ if( nIcons > iconDirCount - nIconIndex ) nIcons = iconDirCount - nIconIndex; /* starting from specified index */ xresent = (const IMAGE_RESOURCE_DIRECTORY_ENTRY*)(icongroupresdir+1) + nIconIndex; for (i=0; i < nIcons; i++,xresent++) { const IMAGE_RESOURCE_DIRECTORY *resdir; /* go down this resource entry, name */ resdir = (const IMAGE_RESOURCE_DIRECTORY*)((const char *)rootresdir+(xresent->OffsetToDirectory)); /* default language (0) */ resdir = find_entry_default(resdir,rootresdir); igdataent = (const IMAGE_RESOURCE_DATA_ENTRY*)resdir; /* lookup address in mapped image for virtual address */ igdata = NULL; for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) { if (igdataent->OffsetToData < pe_sections[j].VirtualAddress) continue; if (igdataent->OffsetToData+igdataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData) continue; if (igdataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData+igdataent->Size > fsizel) { FIXME("overflow in PE lookup (%s has len %ld, have offset %ld), short file?\n", debugstr_w(lpszExeFileName), fsizel, igdataent->OffsetToData - pe_sections[j].VirtualAddress + pe_sections[j].PointerToRawData + igdataent->Size); goto end; /* failure */ } igdata = peimage+(igdataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData); } if (!igdata) { FIXME("no matching real address for icongroup!\n"); goto end; /* failure */ } pIconId[i] = LookupIconIdFromDirectoryEx(igdata, TRUE, cx1, cy1, flags); if (cx2 && cy2) pIconId[++i] = LookupIconIdFromDirectoryEx(igdata, TRUE, cx2, cy2, flags); } if (!(iconresdir=find_entry_by_id(rootresdir,LOWORD(RT_ICON),rootresdir))) { WARN("No Iconresourcedirectory!\n"); goto end; /* failure */ } for (i=0; i<nIcons; i++) { const IMAGE_RESOURCE_DIRECTORY *xresdir; xresdir = find_entry_by_id(iconresdir, LOWORD(pIconId[i]), rootresdir); if (!xresdir) { WARN("icon entry %d not found\n", LOWORD(pIconId[i])); RetPtr[i]=0; continue; } xresdir = find_entry_default(xresdir, rootresdir); if (!xresdir) { WARN("icon entry %d not found\n", LOWORD(pIconId[i])); RetPtr[i]=0; continue; } idataent = (const IMAGE_RESOURCE_DATA_ENTRY*)xresdir; idata = NULL; /* map virtual to address in image */ for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) { if (idataent->OffsetToData < pe_sections[j].VirtualAddress) continue; if (idataent->OffsetToData+idataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData) continue; idata = peimage+(idataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData); } if (!idata) { WARN("no matching real address found for icondata!\n"); RetPtr[i]=0; continue; } RetPtr[i] = CreateIconFromResourceEx(idata, idataent->Size, TRUE, 0x00030000, cx1, cy1, flags); if (cx2 && cy2) RetPtr[++i] = CreateIconFromResourceEx(idata, idataent->Size, TRUE, 0x00030000, cx2, cy2, flags); } ret = i; /* return number of retrieved icons */ } /* if(sig == IMAGE_NT_SIGNATURE) */ end: UnmapViewOfFile(peimage); /* success */ return ret; }
/*********************************************************************** * dibdrv_SelectPen */ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectPen ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); LOGPEN logpen; DWORD style; TRACE("(%p, %p)\n", dev, hpen); if (!GetObjectW( hpen, sizeof(logpen), &logpen )) { /* must be an extended pen */ EXTLOGPEN *elp; INT size = GetObjectW( hpen, 0, NULL ); if (!size) return 0; elp = HeapAlloc( GetProcessHeap(), 0, size ); GetObjectW( hpen, size, elp ); /* FIXME: add support for user style pens */ logpen.lopnStyle = elp->elpPenStyle; logpen.lopnWidth.x = elp->elpWidth; logpen.lopnWidth.y = 0; logpen.lopnColor = elp->elpColor; HeapFree( GetProcessHeap(), 0, elp ); } if (hpen == GetStockObject( DC_PEN )) logpen.lopnColor = GetDCPenColor( dev->hdc ); pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logpen.lopnColor); calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor); pdev->pen_pattern = dash_patterns[PS_SOLID]; pdev->defer |= DEFER_PEN; style = logpen.lopnStyle & PS_STYLE_MASK; switch(style) { case PS_SOLID: if(logpen.lopnStyle & PS_GEOMETRIC) break; if(logpen.lopnWidth.x > 1) break; pdev->pen_line = solid_pen_line; pdev->defer &= ~DEFER_PEN; break; case PS_DASH: case PS_DOT: case PS_DASHDOT: case PS_DASHDOTDOT: if(logpen.lopnStyle & PS_GEOMETRIC) break; if(logpen.lopnWidth.x > 1) break; pdev->pen_line = dashed_pen_line; pdev->pen_pattern = dash_patterns[style]; pdev->defer &= ~DEFER_PEN; break; case PS_NULL: pdev->pen_line = null_pen_line; pdev->defer &= ~DEFER_PEN; break; default: break; } return next->funcs->pSelectPen( next, hpen ); }
static void NoStatStreamImpl_Destroy(NoStatStreamImpl* This) { GlobalFree(This->supportHandle); This->supportHandle=0; HeapFree(GetProcessHeap(), 0, This); }