(module winsubsys racket/base
  (provide set-subsystem)
  
  (define DF_NewHeaderOffset #x3C)
  (define DF_SubsystemOffset #x5C)
  
  (define (set-subsystem file subsys)
    (let-values ([(in out) (open-input-output-file file #:exists 'update)])
      (file-position in DF_NewHeaderOffset)
      (let ([offset (integer-bytes->integer (read-bytes 4 in) #f #f)])
        (file-position out (+ offset DF_SubsystemOffset))
        (write-bytes (integer->integer-bytes
                      (case subsys
                        [(windows) 2]
                        [(console) 3])
                      4 #f #f)
                     out)
        (close-input-port in)
        (close-output-port out)))))
