diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+0.10.0 - 090812
+* changed processToProfile to accept parameters as a list of strings
+* added some preliminary Win32 code that still doesn't work due to
+  sharing violations
+
 0.9.0 - 090810
 * switched to Int64 for representing costs
 * added a Maybe layer to readProfile as well
diff --git a/Profiling/Heap/Process.hs b/Profiling/Heap/Process.hs
--- a/Profiling/Heap/Process.hs
+++ b/Profiling/Heap/Process.hs
@@ -101,10 +101,9 @@
 {-| A helper function to create a 'CreateProcess' structure. -}
 processToProfile :: FilePath       -- ^ The executable to profile (relative paths start from the working directory).
                  -> Maybe FilePath -- ^ An optional working directory (inherited from the parent if not given).
-                 -> String         -- ^ The list of parameters to pass to the program.
+                 -> [String]       -- ^ The list of parameters to pass to the program.
                  -> [ProfParam]    -- ^ Profiling parameters.
                  -> CreateProcess  -- ^ The resulting structure.
-processToProfile exec dir params profParams = (shell cmd) { cwd = dir }
+processToProfile exec dir params profParams = (proc exec allParams) { cwd = dir }
     where -- Note: this doesn't handle --RTS in the param string!
-          cmd = exec ++ ' ' : params ++
-                (if null profParams then "" else " +RTS " ++ show profParams)
+          allParams = params ++ (if null profParams then [] else "+RTS" : map show profParams)
diff --git a/Profiling/Heap/Read.hs b/Profiling/Heap/Read.hs
--- a/Profiling/Heap/Read.hs
+++ b/Profiling/Heap/Read.hs
@@ -33,9 +33,15 @@
 import System.IO
 import System.Process
 
+{- Win32 code
+import Foreign.ForeignPtr
+import System.Win32.File
+-}
+
 -- Data structures
 import Data.ByteString.Char8 (ByteString)
 import qualified Data.ByteString.Char8 as S
+import Data.ByteString.Internal as SI
 import Data.List
 import Data.Maybe
 import qualified Data.IntMap as IM
@@ -184,17 +190,27 @@
 profileCallback :: ProfilingCommand -> ProfileSink -> IO (Maybe (ProfilingStop,ProfilingInfo))
 profileCallback (Local prog) sink = do
   dir <- getCurrentDirectory
-  let hpPath = fromMaybe dir (cwd prog) ++
-               '/' : (takeFileName . execPath . cmdspec) prog ++ ".hp"
-      -- Yes, this is extremely naive, but it will do for the time being...
+  let -- Yes, this is extremely naive, but it will do for the time
+      -- being...  Note that processToProfile creates a RawCommand, so
+      -- using it should be safe.
       execPath (ShellCommand cmd) = takeWhile (/=' ') cmd
       execPath (RawCommand path _) = path
 
+  -- The .hp file appears in the working directory of the process, and
+  -- shares the name of the executable.
+  hpPath <- canonicalizePath $ fromMaybe dir (cwd prog) ++
+            '/' : (takeFileName . execPath . cmdspec) prog ++ ".hp"
+
   -- We have to delete the .hp file and wait for the process to create it.
   catch (removeFile hpPath) (const (return ()))
   (_,_,_,phdl) <- createProcess prog
 
+  -- Unfortunately this doesn't seem to work in Windows due to file
+  -- locking.  Must use Win32 API to open file for shared reading.
   maybeHpFile <- tryRepeatedly (openFile hpPath ReadMode) 50 10000
+{- Win32 code
+  maybeHpFile <- tryRepeatedly (createFile hpPath gENERIC_READ 0 fILE_SHARE_READ Nothing oPEN_EXISTING fILE_ATTRIBUTE_NORMAL Nothing) 50 10000
+-}
 
   case maybeHpFile of
     Nothing -> return Nothing
@@ -242,6 +258,15 @@
                         else do
                           newChars <- S.hGetNonBlocking hpFile 0x10000
                           pass (S.append buf newChars) idmap smp
+{- Win32 code
+                      rawBuf <- mallocByteString 0x10000
+                      bytesRead <- fromIntegral <$> win32_ReadFile hpFile (unsafeForeignPtrToPtr rawBuf) 0xffff Nothing
+                      if bytesRead == 0 then do
+                          threadDelay 100000
+                          pass buf idmap smp
+                        else do
+                          pass (S.append buf (fromForeignPtr rawBuf 0 bytesRead)) idmap smp
+-}
                     -- The other process ended, let's notify the callback.
                     else sink SinkStop
       
diff --git a/hp2any-core.cabal b/hp2any-core.cabal
--- a/hp2any-core.cabal
+++ b/hp2any-core.cabal
@@ -1,5 +1,5 @@
 Name:          hp2any-core
-Version:       0.9.0
+Version:       0.10.0
 Cabal-Version: >= 1.2
 Synopsis:      Heap profiling helper library
 Category:      profiling, development, utils
@@ -13,6 +13,7 @@
 Author:        Patai Gergely
 Maintainer:    Patai Gergely (patai@iit.bme.hu)
 Copyright:     (c) 2009, Patai Gergely
+Homepage:      http://www.haskell.org/haskellwiki/Hp2any
 License:       BSD3
 License-File:  LICENSE
 Stability:     experimental
