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

📄 desktop.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
	      BOOL bCommonGroup)
{
  WCHAR szGroupPath[MAX_PATH];

  DPRINT1 ("CreateGroupW() called\n");

  if (lpGroupName == NULL || *lpGroupName == 0)
    return TRUE;

  if (!GetProgramsPath (bCommonGroup, szGroupPath))
    {
      DPRINT1 ("GetProgramsPath() failed\n");
      return FALSE;
    }
  DPRINT1 ("Programs path: '%S'\n", szGroupPath);

  wcscat (szGroupPath, L"\\");
  wcscat (szGroupPath, lpGroupName);
  DPRINT1 ("Group path: '%S'\n", szGroupPath);

  /* Create directory path */
  if (!CreateDirectoryPath (szGroupPath, NULL))
    return FALSE;

  /* FIXME: Notify the shell */

  DPRINT1 ("CreateGroupW() done\n");

  return TRUE;
}


BOOL WINAPI
DeleteGroupA (LPCSTR lpGroupName,
	      BOOL bCommonGroup)
{
  UNICODE_STRING GroupName;
  BOOL bResult;
  NTSTATUS Status;

  Status = RtlCreateUnicodeStringFromAsciiz(&GroupName,
					    (LPSTR)lpGroupName);
  if (!NT_SUCCESS(Status))
    {
      SetLastError (RtlNtStatusToDosError (Status));
      return FALSE;
    }

  bResult = DeleteGroupW(GroupName.Buffer, bCommonGroup);

  RtlFreeUnicodeString(&GroupName);

  return bResult;
}


BOOL WINAPI
DeleteGroupW (LPCWSTR lpGroupName,
	      BOOL bCommonGroup)
{
  WCHAR szGroupPath[MAX_PATH];

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

  if (lpGroupName == NULL || *lpGroupName == 0)
    return TRUE;

  if (!GetProgramsPath (bCommonGroup, szGroupPath))
    {
      DPRINT1 ("GetProgramsPath() failed\n");
      return FALSE;
    }
  DPRINT ("Programs path: '%S'\n", szGroupPath);

  wcscat (szGroupPath, L"\\");
  wcscat (szGroupPath, lpGroupName);
  DPRINT ("Group path: '%S'\n", szGroupPath);

  /* Remove directory path */
  if (!RemoveDirectoryPath (szGroupPath))
    return FALSE;

  /* FIXME: Notify the shell */

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

  return TRUE;
}


BOOL WINAPI
AddItemA (LPCSTR lpGroupName,  /* Optional */
	  BOOL bCommonGroup,
	  LPCSTR lpItemName,
	  LPCSTR lpArguments,
	  LPCSTR lpIconLocation,
	  INT iIcon,
	  LPCSTR lpWorkingDirectory,  /* Optional */
	  WORD wHotKey,
	  INT iShowCmd)
{
  UNICODE_STRING GroupName;
  UNICODE_STRING ItemName;
  UNICODE_STRING Arguments;
  UNICODE_STRING IconLocation;
  UNICODE_STRING WorkingDirectory;
  BOOL bResult;
  NTSTATUS Status;

  Status = RtlCreateUnicodeStringFromAsciiz(&ItemName,
					    (LPSTR)lpItemName);
  if (!NT_SUCCESS(Status))
    {
      SetLastError (RtlNtStatusToDosError (Status));
      return FALSE;
    }

  Status = RtlCreateUnicodeStringFromAsciiz(&Arguments,
					    (LPSTR)lpArguments);
  if (!NT_SUCCESS(Status))
    {
      RtlFreeUnicodeString(&ItemName);
      SetLastError (RtlNtStatusToDosError (Status));
      return FALSE;
    }

  Status = RtlCreateUnicodeStringFromAsciiz(&IconLocation,
					    (LPSTR)lpIconLocation);
  if (!NT_SUCCESS(Status))
    {
      RtlFreeUnicodeString(&Arguments);
      RtlFreeUnicodeString(&ItemName);
      SetLastError (RtlNtStatusToDosError (Status));
      return FALSE;
    }

  if (lpGroupName != NULL)
    {
      Status = RtlCreateUnicodeStringFromAsciiz(&GroupName,
						(LPSTR)lpGroupName);
      if (!NT_SUCCESS(Status))
	{
	  RtlFreeUnicodeString(&IconLocation);
	  RtlFreeUnicodeString(&Arguments);
	  RtlFreeUnicodeString(&ItemName);
	  SetLastError (RtlNtStatusToDosError (Status));
	  return FALSE;
	}
    }

  if (lpWorkingDirectory != NULL)
    {
      Status = RtlCreateUnicodeStringFromAsciiz(&WorkingDirectory,
						(LPSTR)lpWorkingDirectory);
      if (!NT_SUCCESS(Status))
	{
	  if (lpGroupName != NULL)
	    {
	      RtlFreeUnicodeString(&GroupName);
	    }
	  RtlFreeUnicodeString(&IconLocation);
	  RtlFreeUnicodeString(&Arguments);
	  RtlFreeUnicodeString(&ItemName);
	  SetLastError (RtlNtStatusToDosError (Status));
	  return FALSE;
	}
    }

  bResult = AddItemW((lpGroupName != NULL) ? GroupName.Buffer : NULL,
		     bCommonGroup,
		     ItemName.Buffer,
		     Arguments.Buffer,
		     IconLocation.Buffer,
		     iIcon,
		     (lpWorkingDirectory != NULL) ? WorkingDirectory.Buffer : NULL,
		     wHotKey,
		     iShowCmd);

  if (lpGroupName != NULL)
    {
      RtlFreeUnicodeString(&GroupName);
    }

  if (lpWorkingDirectory != NULL)
    {
      RtlFreeUnicodeString(&WorkingDirectory);
    }

  RtlFreeUnicodeString(&IconLocation);
  RtlFreeUnicodeString(&Arguments);
  RtlFreeUnicodeString(&ItemName);

  return bResult;
}


BOOL WINAPI
AddItemW (LPCWSTR lpGroupName,  /* Optional */
	  BOOL bCommonGroup,
	  LPCWSTR lpItemName,
	  LPCWSTR lpArguments,
	  LPCWSTR lpIconLocation,
	  INT iIcon,
	  LPCWSTR lpWorkingDirectory,  /* Optional */
	  WORD wHotKey,
	  INT iShowCmd)
{
  DYN_FUNCS Ole32;
  WCHAR szLinkPath[MAX_PATH];
  WCHAR szArguments[MAX_PATH];
  WCHAR szCommand[MAX_PATH];
  WIN32_FIND_DATAW FindData;
  HANDLE hFind;
  LPWSTR Ptr;
  DWORD dwLength;
  IShellLinkW* psl;
  IPersistFile* ppf;
  HRESULT hr;
  BOOL bResult;

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

  bResult = FALSE;

  if (!GetProgramsPath (bCommonGroup, szLinkPath))
    {
      DPRINT1 ("GetProgramsPath() failed\n");
      return FALSE;
    }

  DPRINT ("Programs path: '%S'\n", szLinkPath);

  if (lpGroupName != NULL && *lpGroupName != 0)
    {
      wcscat (szLinkPath, L"\\");
      wcscat (szLinkPath, lpGroupName);

      /* Make sure the path exists */
      hFind = FindFirstFileW (szLinkPath,
			      &FindData);
      if (hFind == INVALID_HANDLE_VALUE)
	{
	  DPRINT ("'%S' does not exist\n", szLinkPath);
	  if (!CreateGroupW (lpGroupName,
			     bCommonGroup))
	    return FALSE;
	}
      else
	{
	  DPRINT ("'%S' exists\n", szLinkPath);
	  FindClose (hFind);
	}
    }

  wcscat (szLinkPath, L"\\");
  wcscat (szLinkPath, lpItemName);
  wcscat (szLinkPath, L".lnk");
  DPRINT ("Link path: '%S'\n", szLinkPath);

  /* Split 'lpArguments' string into command and arguments */
  Ptr = wcschr (lpArguments, L' ');
  DPRINT ("Ptr %p  lpArguments %p\n", Ptr, lpArguments);
  if (Ptr != NULL)
    {
      dwLength = (DWORD)(Ptr - lpArguments);
      DPRINT ("dwLength %lu\n", dwLength);
      memcpy (szCommand, lpArguments, dwLength * sizeof(WCHAR));
      szCommand[dwLength] = 0;
      Ptr++;
      wcscpy (szArguments, Ptr);
    }
  else
    {
      wcscpy (szCommand, lpArguments);
      szArguments[0] = 0;
    }
  DPRINT ("szCommand: '%S'\n", szCommand);
  DPRINT ("szArguments: '%S'\n", szArguments);

  /* Dynamically load ole32.dll */
  if (!LoadDynamicImports(&DynOle32, &Ole32))
    {
      DPRINT1("USERENV: Unable to load OLE32.DLL\n");
      return FALSE;
    }

  Ole32.fn.CoInitialize(NULL);

  hr = Ole32.fn.CoCreateInstance(&CLSID_ShellLink,
                                 NULL,
                                 CLSCTX_INPROC_SERVER,
                                 &IID_IShellLinkW,
                                 (LPVOID*)&psl);
  if (!SUCCEEDED(hr))
    {
      Ole32.fn.CoUninitialize();
      UnloadDynamicImports(&Ole32);
      return FALSE;
    }

  hr = psl->lpVtbl->QueryInterface(psl,
                                   &IID_IPersistFile,
                                   (LPVOID*)&ppf);
  if (SUCCEEDED(hr))
    {
      psl->lpVtbl->SetDescription(psl,
                                  lpItemName);

      psl->lpVtbl->SetPath(psl,
                           szCommand);

      psl->lpVtbl->SetArguments(psl,
                                szArguments);

      psl->lpVtbl->SetIconLocation(psl,
                                   lpIconLocation,
                                   iIcon);

      if (lpWorkingDirectory != NULL)
        {
          psl->lpVtbl->SetWorkingDirectory(psl,
                                           lpWorkingDirectory);
        }
      else
        {
          psl->lpVtbl->SetWorkingDirectory(psl,
                                           L"%HOMEDRIVE%%HOMEPATH%");
        }

      psl->lpVtbl->SetHotkey(psl,
                             wHotKey);

      psl->lpVtbl->SetShowCmd(psl,
                              iShowCmd);

      hr = ppf->lpVtbl->Save(ppf,
                             szLinkPath,
                             TRUE);
      if (SUCCEEDED(hr))
        bResult = TRUE;

      ppf->lpVtbl->Release(ppf);
    }

  psl->lpVtbl->Release(psl);

  Ole32.fn.CoUninitialize();
  UnloadDynamicImports(&Ole32);

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

  return bResult;
}


BOOL WINAPI
DeleteItemA (LPCSTR lpGroupName, /* Optional */
	     BOOL bCommonGroup,
	     LPCSTR lpItemName,
	     BOOL bDeleteGroup)
{
  UNICODE_STRING GroupName;
  UNICODE_STRING ItemName;
  BOOL bResult;
  NTSTATUS Status;

  if (lpGroupName != NULL)
    {
      Status = RtlCreateUnicodeStringFromAsciiz(&GroupName,
						(LPSTR)lpGroupName);
      if (!NT_SUCCESS(Status))
	{
	  SetLastError (RtlNtStatusToDosError (Status));
	  return FALSE;
	}
    }

  Status = RtlCreateUnicodeStringFromAsciiz(&ItemName,
					    (LPSTR)lpItemName);
  if (!NT_SUCCESS(Status))
    {
      if (lpGroupName != NULL)
	{
	  RtlFreeUnicodeString(&GroupName);
	}

      SetLastError (RtlNtStatusToDosError (Status));
      return FALSE;
    }

  bResult = DeleteItemW((lpGroupName != NULL) ? GroupName.Buffer : NULL,
			bCommonGroup,
			ItemName.Buffer,
			bDeleteGroup);

  RtlFreeUnicodeString(&ItemName);
  if (lpGroupName != NULL)
    {
      RtlFreeUnicodeString(&GroupName);
    }

  return bResult;
}


BOOL WINAPI
DeleteItemW (LPCWSTR lpGroupName, /* Optional */
	     BOOL bCommonGroup,
	     LPCWSTR lpItemName,
	     BOOL bDeleteGroup)
{
  WCHAR szItemPath[MAX_PATH];
  LPWSTR Ptr;

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

  if (!GetProgramsPath (bCommonGroup, szItemPath))
    {
      DPRINT1 ("GetProgramsPath() failed\n");
      return FALSE;
    }
  DPRINT ("Programs path: '%S'\n", szItemPath);

  if (lpGroupName != NULL && *lpGroupName != 0)
    {
      wcscat (szItemPath, L"\\");
      wcscat (szItemPath, lpGroupName);
    }

  wcscat (szItemPath, L"\\");
  wcscat (szItemPath, lpItemName);
  wcscat (szItemPath, L".lnk");
  DPRINT ("Item path: '%S'\n", szItemPath);

  if (!DeleteFileW (szItemPath))
    return FALSE;

  /* FIXME: Notify the shell */

  if (bDeleteGroup)
    {
      Ptr = wcsrchr (szItemPath, L'\\');
      if (Ptr == NULL)
	return TRUE;

      *Ptr = 0;
      DPRINT ("Item path: '%S'\n", szItemPath);
      if (RemoveDirectoryW (szItemPath))
	{
	  /* FIXME: Notify the shell */
	}
    }

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

  return TRUE;
}

/* EOF */

⌨️ 快捷键说明

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