⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setup.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	  Error = RegSetValueExW(hKey,
			         lpFolderData->lpValueName,
			         0,
			         REG_EXPAND_SZ,
			         (LPBYTE)szBuffer,
			         dwLength);
          if (Error != ERROR_SUCCESS)
	    {
	      DPRINT1("Error: %lu\n", Error);
	      RegCloseKey(hKey);
              SetLastError((DWORD)Error);
	      return FALSE;
	    }
	}

      lpFolderData++;
    }

  RegCloseKey(hKey);


  /* Set 'AllUsersProfile' value */
  wcscpy(szBuffer, L"All Users");
  if (!AppendSystemPostfix(szBuffer, MAX_PATH))
    {
      DPRINT1("AppendSystemPostfix() failed\n", GetLastError());
      return FALSE;
    }

  Error = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
		        L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList",
		        0,
		        KEY_SET_VALUE,
		        &hKey);
  if (Error != ERROR_SUCCESS)
    {
      DPRINT1("Error: %lu\n", Error);
      SetLastError((DWORD)Error);
      return FALSE;
    }

  dwLength = (wcslen(szBuffer) + 1) * sizeof(WCHAR);
  Error = RegSetValueExW(hKey,
		         L"AllUsersProfile",
		         0,
		         REG_SZ,
		         (LPBYTE)szBuffer,
		         dwLength);
  if (Error != ERROR_SUCCESS)
    {
      DPRINT1("Error: %lu\n", Error);
      RegCloseKey (hKey);
      SetLastError((DWORD)Error);
      return FALSE;
    }

  RegCloseKey(hKey);


  /* Create 'All Users' profile directory */
  wcscpy(szProfilePath, szProfilesPath);
  wcscat(szProfilePath, L"\\");
  wcscat(szProfilePath, szBuffer);
  if (!CreateDirectoryW(szProfilePath, NULL))
    {
      if (GetLastError() != ERROR_ALREADY_EXISTS)
	{
	  DPRINT1("Error: %lu\n", GetLastError());
	  return FALSE;
	}
    }

  /* Set 'All Users' profile */
  SetEnvironmentVariableW(L"ALLUSERSPROFILE", szProfilePath);

  /* Create 'All Users' subdirectories */
  /* FIXME: Take these paths from the registry */
  lpFolderData = &CommonShellFolders[0];
  while (lpFolderData->lpValueName != NULL)
    {
      wcscpy(szBuffer, szProfilePath);
      wcscat(szBuffer, L"\\");

      /* Append the folder name */
      dwLength = wcslen(szBuffer);
      if (!LoadStringW(hInstance,
		       lpFolderData->uId,
		       &szBuffer[dwLength],
		       MAX_PATH - dwLength))
	{
	  /* Use the default name instead */
	  wcscat(szBuffer, lpFolderData->lpPath);
	}

      if (!CreateDirectoryW(szBuffer, NULL))
	{
	  if (GetLastError() != ERROR_ALREADY_EXISTS)
	    {
	      DPRINT1("Error: %lu\n", GetLastError());
	      return FALSE;
	    }
	}

      if (lpFolderData->bHidden)
	{
	  SetFileAttributesW(szBuffer,
			     FILE_ATTRIBUTE_HIDDEN);
	}

      lpFolderData++;
    }

  /* Set common 'Shell Folders' values */
  Error = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
		        L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
		        0,
		        KEY_SET_VALUE,
		        &hKey);
  if (Error != ERROR_SUCCESS)
    {
      DPRINT1("Error: %lu\n", Error);
      SetLastError((DWORD)Error);
      return FALSE;
    }

  lpFolderData = &CommonShellFolders[0];
  while (lpFolderData->lpValueName != NULL)
    {
      if (lpFolderData->bShellFolder)
	{
	  wcscpy(szBuffer, szProfilePath);
	  wcscat(szBuffer, L"\\");

	  /* Append the folder name */
	  dwLength = wcslen(szBuffer);
	  if (!LoadStringW(hInstance,
			   lpFolderData->uId,
			   &szBuffer[dwLength],
			   MAX_PATH - dwLength))
	    {
	      /* Use the default name instead */
	      wcscat(szBuffer, lpFolderData->lpPath);
	    }

	  dwLength = (wcslen(szBuffer) + 1) * sizeof(WCHAR);
	  Error = RegSetValueExW(hKey,
			         lpFolderData->lpValueName,
			         0,
			         REG_SZ,
			         (LPBYTE)szBuffer,
			         dwLength);
          if (Error != ERROR_SUCCESS)
	    {
	      DPRINT1("Error: %lu\n", Error);
	      RegCloseKey(hKey);
              SetLastError((DWORD)Error);
	      return FALSE;
	    }
	}

      lpFolderData++;
    }

  RegCloseKey(hKey);

  /* Set common 'User Shell Folders' values */
  Error = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
		        L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders",
		        0,
		        KEY_SET_VALUE,
		        &hKey);
  if (Error != ERROR_SUCCESS)
    {
      DPRINT1("Error: %lu\n", Error);
      SetLastError((DWORD)Error);
      return FALSE;
    }

  lpFolderData = &CommonShellFolders[0];
  while (lpFolderData->lpValueName != NULL)
    {
      if (lpFolderData->bUserShellFolder)
	{
	  wcscpy(szBuffer, L"%ALLUSERSPROFILE%\\");

	  /* Append the folder name */
	  dwLength = wcslen(szBuffer);
	  if (!LoadStringW(hInstance,
			   lpFolderData->uId,
			   &szBuffer[dwLength],
			   MAX_PATH - dwLength))
	    {
	      /* Use the default name instead */
	      wcscat(szBuffer, lpFolderData->lpPath);
	    }

	  dwLength = (wcslen(szBuffer) + 1) * sizeof(WCHAR);
	  Error = RegSetValueExW(hKey,
			         lpFolderData->lpValueName,
			         0,
			         REG_EXPAND_SZ,
			         (LPBYTE)szBuffer,
			         dwLength);
          if (Error != ERROR_SUCCESS)
	    {
	      DPRINT1("Error: %lu\n", Error);
	      RegCloseKey(hKey);
              SetLastError((DWORD)Error);
	      return FALSE;
	    }
	}

      lpFolderData++;
    }

  RegCloseKey(hKey);

  /* Load 'Program Files' location */
  if (!LoadStringW(hInstance,
		  IDS_PROGRAMFILES,
		  szBuffer,
		  MAX_PATH))
    {
      DPRINT1("Error: %lu\n", GetLastError());
      return FALSE;
    }

  /* Expand it */
  if (!ExpandEnvironmentStringsW (szBuffer,
				  szProfilesPath,
				  MAX_PATH))
    {
      DPRINT1("Error: %lu\n", GetLastError());
      return FALSE;
    }

  /* Store it */
  Error = RegOpenKeyExW (HKEY_LOCAL_MACHINE,
		         L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion",
		         0,
		         KEY_SET_VALUE,
		         &hKey);
  if (Error != ERROR_SUCCESS)
    {
      DPRINT1("Error: %lu\n", Error);
      SetLastError((DWORD)Error);
      return FALSE;
    }

  dwLength = (wcslen (szProfilesPath) + 1) * sizeof(WCHAR);
  Error = RegSetValueExW (hKey,
		          L"ProgramFilesDir",
		          0,
		          REG_SZ,
		          (LPBYTE)szProfilesPath,
		          dwLength);
  if (Error != ERROR_SUCCESS)
    {
      DPRINT1("Error: %lu\n", Error);
      RegCloseKey (hKey);
      SetLastError((DWORD)Error);
      return FALSE;
    }

  RegCloseKey (hKey);

  /* Create directory */
  if (!CreateDirectoryW (szProfilesPath, NULL))
    {
      if (GetLastError () != ERROR_ALREADY_EXISTS)
	{
	  DPRINT1("Error: %lu\n", GetLastError());
	  return FALSE;
	}
    }


  DPRINT("Success\n");

  return TRUE;
}


BOOL
UpdateUsersShellFolderSettings(LPCWSTR lpUserProfilePath,
			       HKEY hUserKey)
{
  WCHAR szBuffer[MAX_PATH];
  DWORD dwLength;
  PFOLDERDATA lpFolderData;
  HKEY hFoldersKey;
  LONG Error;

  DPRINT("UpdateUsersShellFolderSettings() called\n");

  DPRINT("User profile path: %S\n", lpUserProfilePath);

  Error = RegOpenKeyExW(hUserKey,
		        L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
		        0,
		        KEY_SET_VALUE,
		        &hFoldersKey);
  if (Error != ERROR_SUCCESS)
    {
      DPRINT1("Error: %lu\n", Error);
      SetLastError((DWORD)Error);
      return FALSE;
    }

  lpFolderData = &UserShellFolders[0];
  while (lpFolderData->lpValueName != NULL)
    {
      if (lpFolderData->bShellFolder)
	{
	  wcscpy(szBuffer, lpUserProfilePath);
	  wcscat(szBuffer, L"\\");

	  /* Append the folder name */
	  dwLength = wcslen(szBuffer);
	  if (!LoadStringW(hInstance,
			   lpFolderData->uId,
			   &szBuffer[dwLength],
			   MAX_PATH - dwLength))
	    {
	      /* Use the default name instead */
	      wcscat(szBuffer, lpFolderData->lpPath);
	    }

	  DPRINT("%S: %S\n", lpFolderData->lpValueName, szBuffer);

	  dwLength = (wcslen(szBuffer) + 1) * sizeof(WCHAR);
	  Error = RegSetValueExW(hFoldersKey,
			         lpFolderData->lpValueName,
			         0,
			         REG_SZ,
			         (LPBYTE)szBuffer,
			         dwLength);
          if (Error != ERROR_SUCCESS)
	    {
	      DPRINT1("Error: %lu\n", Error);
	      RegCloseKey(hFoldersKey);
              SetLastError((DWORD)Error);
	      return FALSE;
	    }
	}

      lpFolderData++;
    }

  RegCloseKey(hFoldersKey);

  DPRINT("UpdateUsersShellFolderSettings() done\n");

  return TRUE;
}

/* EOF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -