Home | Info | Community | Development | myReactOS | Contact Us
[static]
Definition at line 37 of file registry.c.
Referenced by CreateUserHive().
{ LONG Error; #if (_WIN32_WINNT >= 0x0600) Error = RegCopyTreeW(hSrcKey, NULL, hDstKey); if (Error != ERROR_SUCCESS) { SetLastError((DWORD)Error); return FALSE; } return TRUE; #else FILETIME LastWrite; DWORD dwSubKeys; DWORD dwValues; DWORD dwType; DWORD dwMaxSubKeyNameLength; DWORD dwSubKeyNameLength; DWORD dwMaxValueNameLength; DWORD dwValueNameLength; DWORD dwMaxValueLength; DWORD dwValueLength; DWORD dwDisposition; DWORD i; LPWSTR lpNameBuffer; LPBYTE lpDataBuffer; HKEY hDstSubKey; HKEY hSrcSubKey; DPRINT ("CopyKey() called \n"); Error = RegQueryInfoKey (hSrcKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyNameLength, NULL, &dwValues, &dwMaxValueNameLength, &dwMaxValueLength, NULL, NULL); if (Error != ERROR_SUCCESS) { DPRINT1 ("RegQueryInfoKey() failed (Error %lu)\n", Error); SetLastError((DWORD)Error); return FALSE; } DPRINT ("dwSubKeys %lu\n", dwSubKeys); DPRINT ("dwMaxSubKeyNameLength %lu\n", dwMaxSubKeyNameLength); DPRINT ("dwValues %lu\n", dwValues); DPRINT ("dwMaxValueNameLength %lu\n", dwMaxValueNameLength); DPRINT ("dwMaxValueLength %lu\n", dwMaxValueLength); /* Copy subkeys */ if (dwSubKeys != 0) { lpNameBuffer = HeapAlloc (GetProcessHeap (), 0, dwMaxSubKeyNameLength * sizeof(WCHAR)); if (lpNameBuffer == NULL) { DPRINT1("Buffer allocation failed\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } for (i = 0; i < dwSubKeys; i++) { dwSubKeyNameLength = dwMaxSubKeyNameLength; Error = RegEnumKeyExW (hSrcKey, i, lpNameBuffer, &dwSubKeyNameLength, NULL, NULL, NULL, &LastWrite); if (Error != ERROR_SUCCESS) { DPRINT1 ("Subkey enumeration failed (Error %lu)\n", Error); HeapFree (GetProcessHeap (), 0, lpNameBuffer); SetLastError((DWORD)Error); return FALSE; } Error = RegCreateKeyExW (hDstKey, lpNameBuffer, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hDstSubKey, &dwDisposition); if (Error != ERROR_SUCCESS) { DPRINT1 ("Subkey creation failed (Error %lu)\n", Error); HeapFree (GetProcessHeap (), 0, lpNameBuffer); SetLastError((DWORD)Error); return FALSE; } Error = RegOpenKeyExW (hSrcKey, lpNameBuffer, 0, KEY_READ, &hSrcSubKey); if (Error != ERROR_SUCCESS) { DPRINT1 ("Error: %lu\n", Error); RegCloseKey (hDstSubKey); HeapFree (GetProcessHeap (), 0, lpNameBuffer); SetLastError((DWORD)Error); return FALSE; } if (!CopyKey (hDstSubKey, hSrcSubKey)) { DPRINT1 ("Error: %lu\n", GetLastError()); RegCloseKey (hSrcSubKey); RegCloseKey (hDstSubKey); HeapFree (GetProcessHeap (), 0, lpNameBuffer); return FALSE; } RegCloseKey (hSrcSubKey); RegCloseKey (hDstSubKey); } HeapFree (GetProcessHeap (), 0, lpNameBuffer); } /* Copy values */ if (dwValues != 0) { lpNameBuffer = HeapAlloc (GetProcessHeap (), 0, dwMaxValueNameLength * sizeof(WCHAR)); if (lpNameBuffer == NULL) { DPRINT1 ("Buffer allocation failed\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } lpDataBuffer = HeapAlloc (GetProcessHeap (), 0, dwMaxValueLength); if (lpDataBuffer == NULL) { DPRINT1 ("Buffer allocation failed\n"); HeapFree (GetProcessHeap (), 0, lpNameBuffer); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } for (i = 0; i < dwValues; i++) { dwValueNameLength = dwMaxValueNameLength; dwValueLength = dwMaxValueLength; Error = RegEnumValueW (hSrcKey, i, lpNameBuffer, &dwValueNameLength, NULL, &dwType, lpDataBuffer, &dwValueLength); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); HeapFree (GetProcessHeap (), 0, lpDataBuffer); HeapFree (GetProcessHeap (), 0, lpNameBuffer); SetLastError((DWORD)Error); return FALSE; } Error = RegSetValueExW (hDstKey, lpNameBuffer, 0, dwType, lpDataBuffer, dwValueLength); if (Error != ERROR_SUCCESS) { DPRINT1("Error: %lu\n", Error); HeapFree (GetProcessHeap (), 0, lpDataBuffer); HeapFree (GetProcessHeap (), 0, lpNameBuffer); SetLastError((DWORD)Error); return FALSE; } } HeapFree (GetProcessHeap (), 0, lpDataBuffer); HeapFree (GetProcessHeap (), 0, lpNameBuffer); } DPRINT ("CopyKey() done \n"); return TRUE; #endif }