diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 4cc530509a..88c7f3c1d3 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -15,6 +15,7 @@
 ;;; Copyright © 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2020 Brett Gilio <brettg@gnu.org>
 ;;; Copyright © 2020 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2020 Morgan Smith <Morgan.J.Smith@outlook.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -47,6 +48,8 @@
   #:use-module (gnu packages ghostscript)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gnome)
+  #:use-module (gnu packages gperf)
+  #:use-module (gnu packages gettext)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages libevent)
   #:use-module (gnu packages libffi)
@@ -68,6 +71,7 @@
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages time)
   #:use-module (gnu packages tls)
+  #:use-module (gnu packages version-control)
   #:use-module (gnu packages virtualization)
   #:use-module (gnu packages web-browsers)
   #:use-module (gnu packages xml)
@@ -2831,6 +2835,106 @@ writing to these structures, and they are accessed via the Bigarray module.")
     (description "Hex is a minimal library providing hexadecimal converters.")
     (license license:isc)))
 
+(define-public ocaml-hivex
+  (package
+    (name "ocaml-hivex")
+    ;; Make sure to update the gnulib input to the commit upstream uses when
+    ;; updating this package
+    (version "1.3.19")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/libguestfs/hivex")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1gw59ac6z4fbg0flajnsh6d25h75pnk4605d5rw9rv0bvhfvway5"))))
+    (build-system ocaml-build-system)
+    (arguments
+     `(;; XXX: I'm not sure why runpath validation doesn't work
+       #:validate-runpath? #f
+       #:configure-flags
+       (list (string-append "CONFIG_SHELL="
+                            (assoc-ref %build-inputs "bash") "/bin/bash")
+             (string-append "SHELL="
+                            (assoc-ref %build-inputs "bash") "/bin/bash"))
+       #:test-target "check"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'unpack-gnulib
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((gnulib (assoc-ref inputs "gnulib")))
+               ;; Upstream gnulib is cloned into this directory as a submodule
+               (copy-recursively gnulib ".gnulib")
+               #t)))
+         ;; Autogen calls bootstrap and then generates a configure script
+         (add-before 'configure 'autogen
+           (lambda _
+             (chmod "configure.ac" #o644)
+             (invoke "./autogen.sh")
+             #t))
+         (add-before 'autogen 'fix-bootstrap
+           (lambda _
+             ;; Stop bootstrap from cloning gnulib
+             (substitute* "bootstrap"
+               (("^git.*$") ""))
+             #t))
+         (add-before 'autogen 'fix-autogen.sh
+           (lambda _
+             (substitute* "autogen.sh"
+               ;; Forces bootstrap to run
+               (("git submodule status") "echo false")
+               ;; Don't run configure yet
+               (("^.*configure.*$") "echo\n"))
+             #t))
+         (add-after 'autogen 'patch-configure-and-build-aux
+           (lambda* (#:key native-inputs inputs outputs #:allow-other-keys)
+             (patch-shebang "configure")
+             ;; Hard code paths to ld and file in the configure script
+             (substitute* "configure"
+               (("/usr/bin/ld")
+                (string-append (assoc-ref inputs "ld-wrapper") "/bin/ld"))
+               (("/usr/bin/file")
+                (string-append (assoc-ref inputs "file") "/bin/file")))
+             #t))
+         (add-before 'install 'patch-ocaml-installdir
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               ;; Force ocaml installdir to be correct
+               (substitute* "ocaml/Makefile"
+                 (("\\$\\(DESTDIR\\)\\$\\(OCAMLLIB\\)")
+                  (string-append
+                   out "/lib/ocaml/site-lib"))))
+             #t)))))
+    (native-inputs
+     `(("autoconf" ,autoconf)
+       ("automake" ,automake)
+       ("gperg" ,gperf)
+       ("libtool" ,libtool)
+       ("pkg-config" ,pkg-config)
+       ("gnulib"
+        ;; This is the commit upstream uses
+        ,(let ((commit "5e50baa16ef90204d9048a9e2f23c5a538955121"))
+           (origin
+             (method git-fetch)
+             (uri (git-reference
+                   (url "git://git.savannah.gnu.org/gnulib.git")
+                   (commit commit)))
+             (sha256
+              (base32 "0clx0gq6mmm4dkzp5pqh02cbzggnc3ba491qb79brpxcrjri1pnd"))
+             (file-name (git-file-name "gnulib" commit)))))))
+    (inputs
+     `(("perl" ,perl)
+       ("sed" ,sed)
+       ("gettext" ,gettext-minimal)))
+    (home-page "https://github.com/libguestfs/hivex")
+    (synopsis "Library for reading and writing Windows Registry \"hive\"
+binary files")
+    (description "This library reads Windows NT registry files (ie. not
+Windows 3.1 or Windows 95/98/ME).")
+    (license license:lgpl2.1)))
+
 (define-public ocaml4.07-ezjsonm
   (package
     (name "ocaml4.07-ezjsonm")
