Win32OperatingSystem.st
changeset 7062 44e3fe28aea0
parent 6799 568d31641c88
child 7065 f4c4e4b2ffa1
equal deleted inserted replaced
7061:d93e1ae84168 7062:44e3fe28aea0
    20 	category:'OS-Windows'
    20 	category:'OS-Windows'
    21 !
    21 !
    22 
    22 
    23 Object subclass:#FileStatusInfo
    23 Object subclass:#FileStatusInfo
    24 	instanceVariableNames:'type mode uid gid size id accessed modified created statusChanged
    24 	instanceVariableNames:'type mode uid gid size id accessed modified created statusChanged
    25 		path alternativeName'
    25 		path fullName alternativeName'
    26 	classVariableNames:''
    26 	classVariableNames:''
    27 	poolDictionaries:''
    27 	poolDictionaries:''
    28 	privateIn:Win32OperatingSystem
    28 	privateIn:Win32OperatingSystem
    29 !
    29 !
    30 
    30 
  2585     "/
  2585     "/
  2586     "/ I know: this is a kludge but should work for now...
  2586     "/ I know: this is a kludge but should work for now...
  2587     "/ ...this will change in an upcoming version to include
  2587     "/ ...this will change in an upcoming version to include
  2588     "/ command.com command-line parsing here (sigh).
  2588     "/ command.com command-line parsing here (sigh).
  2589 
  2589 
  2590 self isMSWINDOWSNTlike ifTrue:[
  2590     self isMSWINDOWSNTlike ifTrue:[
       
  2591         shell := self getEnvironment:'COMSPEC'.
       
  2592         shell isNil ifTrue:[
       
  2593             wDir := self getWindowsSystemDirectory asFilename.
       
  2594             shell := (wDir construct:'cmd.exe').
       
  2595             shell exists ifFalse:[
       
  2596                 shell := (wDir construct:'command.com').
       
  2597                 shell exists ifFalse:[
       
  2598                     self error:'no command.com available'.
       
  2599                 ]
       
  2600             ].
       
  2601             shell := shell pathName.
       
  2602         ].
       
  2603         aCommandString isNil ifTrue:[
       
  2604             ^ Array with:nil with:shell
       
  2605         ].
       
  2606         ^ Array with:nil with:(shell , ' /c ' , aCommandString)
       
  2607     ].
       
  2608 
       
  2609     hasRedirection := false.
       
  2610     (aCommandString isNil or:[aCommandString includesAny:'<>|']) ifTrue:[
       
  2611         hasRedirection := true
       
  2612     ] ifFalse:[
       
  2613         words := aCommandString asCollectionOfSubstringsSeparatedBy:Character space.
       
  2614         args := ' '.
       
  2615         words from:2 to:(words size) do:[:s | 
       
  2616             args := args , (s , ' ').
       
  2617         ].
       
  2618     ].
       
  2619 
       
  2620     "/ I/O redirection is not yet handled directly
       
  2621     "/ fallBack to command.com (below) to do it.
       
  2622 
       
  2623     hasRedirection ifFalse:[
       
  2624         path := self pathOfCommand:(words at:1).
       
  2625         path notNil ifTrue:[
       
  2626             "/ execute the command directly -
       
  2627             "/ without going through command.com
       
  2628 
       
  2629             self isMSWINDOWSNTlike ifTrue:[
       
  2630                 args := path , args.
       
  2631             ].
       
  2632 
       
  2633             ^ Array with:path with:args
       
  2634         ].
       
  2635     ].
       
  2636 
       
  2637     "/ windows-NT (where command.com works)
       
  2638     "/ or I/O redirection or no executable was found
       
  2639 
  2591     shell := self getEnvironment:'COMSPEC'.
  2640     shell := self getEnvironment:'COMSPEC'.
  2592     shell isNil ifTrue:[
  2641     shell isNil ifTrue:[
  2593 	wDir := self getWindowsSystemDirectory asFilename.
  2642         wDir := self getWindowsSystemDirectory asFilename.
  2594 	shell := (wDir construct:'cmd.exe').
  2643         shell := (wDir construct:'cmd.exe').
  2595 	shell exists ifFalse:[
  2644         shell exists ifFalse:[
  2596 	    shell := (wDir construct:'command.com').
  2645             shell := (wDir construct:'command.com').
  2597 	    shell exists ifFalse:[
  2646             shell exists ifFalse:[
  2598 		self error:'no command.com available'.
  2647                 self error:'no command.com available'.
  2599 	    ]
  2648             ]
  2600 	].
  2649         ].
  2601 	shell := shell pathName.
  2650         shell := shell pathName.
  2602     ].
  2651     ].
  2603     aCommandString isNil ifTrue:[
  2652     aCommandString isNil ifTrue:[
  2604 	^ Array with:nil with:shell
  2653         ^ Array with:shell with:shell
  2605     ].
       
  2606     ^ Array with:nil with:(shell , ' /c ' , aCommandString)
       
  2607 ].
       
  2608 
       
  2609     hasRedirection := false.
       
  2610     (aCommandString isNil or:[aCommandString includesAny:'<>|']) ifTrue:[
       
  2611 	hasRedirection := true
       
  2612     ] ifFalse:[
       
  2613 	words := aCommandString asCollectionOfSubstringsSeparatedBy:Character space.
       
  2614 	args := ' '.
       
  2615 	words from:2 to:(words size) do:[:s | 
       
  2616 	    args := args , (s , ' ').
       
  2617 	].
       
  2618     ].
       
  2619 
       
  2620     "/ I/O redirection is not yet handled directly
       
  2621     "/ fallBack to command.com (below) to do it.
       
  2622 
       
  2623     hasRedirection ifFalse:[
       
  2624 	path := self pathOfCommand:(words at:1).
       
  2625 	path notNil ifTrue:[
       
  2626 	    "/ execute the command directly -
       
  2627 	    "/ without going through command.com
       
  2628 
       
  2629 	    self isMSWINDOWSNTlike ifTrue:[
       
  2630 		args := path , args.
       
  2631 	    ].
       
  2632 
       
  2633 	    ^ Array with:path with:args
       
  2634 	].
       
  2635     ].
       
  2636 
       
  2637     "/ windows-NT (where command.com works)
       
  2638     "/ or I/O redirection or no executable was found
       
  2639 
       
  2640     shell := self getEnvironment:'COMSPEC'.
       
  2641     shell isNil ifTrue:[
       
  2642 	wDir := self getWindowsSystemDirectory asFilename.
       
  2643 	shell := (wDir construct:'cmd.exe').
       
  2644 	shell exists ifFalse:[
       
  2645 	    shell := (wDir construct:'command.com').
       
  2646 	    shell exists ifFalse:[
       
  2647 		self error:'no command.com available'.
       
  2648 	    ]
       
  2649 	].
       
  2650 	shell := shell pathName.
       
  2651     ].
       
  2652     aCommandString isNil ifTrue:[
       
  2653 	^ Array with:shell with:shell
       
  2654     ].
  2654     ].
  2655     ^ Array with:shell with:(shell , ' /c ' , aCommandString)
  2655     ^ Array with:shell with:(shell , ' /c ' , aCommandString)
  2656 
  2656 
  2657     "Modified: / 20.1.1998 / 16:57:19 / md"
  2657     "Modified: / 20.1.1998 / 16:57:19 / md"
  2658     "Modified: / 19.5.1999 / 10:01:24 / cg"
  2658     "Modified: / 19.5.1999 / 10:01:24 / cg"
       
  2659 !
       
  2660 
       
  2661 exec:aCommandPath withArguments:argString environment:environment fileDescriptors:fdArray closeDescriptors:closeFdArray fork:doFork newPgrp:newPgrp inDirectory:aDirectory
       
  2662     "Internal lowLevel entry for combined fork & exec for WIN32
       
  2663 
       
  2664      If fork is false (chain a command):
       
  2665          execute the OS command specified by the argument, aCommandPath, with
       
  2666          arguments in argArray (no arguments, if nil).
       
  2667          If successful, this method does not return and smalltalk is gone.
       
  2668          If not successful, it does return.
       
  2669          Normal use is with forkForCommand.
       
  2670 
       
  2671      If fork is true (subprocess command execution):
       
  2672         fork a child to do the above.
       
  2673         The process id of the child process is returned; nil if the fork failed.
       
  2674 
       
  2675      fdArray contains the filedescriptors, to be used for the child (if fork is true).
       
  2676         fdArray[1] = 15 -> use fd 15 as stdin.
       
  2677         If an element of the array is set to nil, the corresponding filedescriptor
       
  2678         will be closed for the child.
       
  2679         fdArray[0] == StdIn for child
       
  2680         fdArray[1] == StdOut for child
       
  2681         fdArray[2] == StdErr for child
       
  2682         on VMS, these must be channels as returned by createMailBox.
       
  2683 
       
  2684      closeFdArray contains descriptors that will be closed in the subprocess.
       
  2685         closeDescriptors are ignored in the WIN32 & VMS versions.
       
  2686 
       
  2687      NOTE that in WIN32 the fds are HANDLES.
       
  2688 
       
  2689      If newPgrp is true, the subprocess will be established in a new process group.
       
  2690         The processgroup will be equal to id.
       
  2691         newPgrp is not used on WIN32 and VMS systems."
       
  2692 
       
  2693     |dirPath cmdPath cmdLine|
       
  2694 
       
  2695     aDirectory notNil ifTrue:[
       
  2696         dirPath := aDirectory asFilename asAbsoluteFilename osNameForDirectory.
       
  2697         (dirPath endsWith:':') ifTrue:[
       
  2698             dirPath := dirPath , '\'.
       
  2699         ].
       
  2700     ].
       
  2701 
       
  2702     self isMSWINDOWSNTlike ifTrue:[
       
  2703         cmdPath := aCommandPath.
       
  2704         cmdLine := argString
       
  2705     ] ifFalse:[
       
  2706         cmdPath := 'stxspawn.exe'.
       
  2707         cmdLine := 'stxspawn.exe ' , aCommandPath , ' ' , argString
       
  2708     ].
       
  2709 
       
  2710     ^ self 
       
  2711         primExec:cmdPath 
       
  2712         commandLine:cmdLine 
       
  2713         fileDescriptors:fdArray 
       
  2714         closeDescriptors:closeFdArray 
       
  2715         fork:doFork 
       
  2716         newPgrp:newPgrp 
       
  2717         inPath:dirPath
       
  2718         createFlags:nil
       
  2719 
       
  2720     "Modified: / 31.1.1998 / 10:54:24 / md"
       
  2721     "Modified: / 15.5.1999 / 18:07:51 / cg"
  2659 !
  2722 !
  2660 
  2723 
  2661 exec:aCommandPath withArguments:argString fileDescriptors:fdArray closeDescriptors:closeFdArray fork:doFork newPgrp:newPgrp inDirectory:aDirectory
  2724 exec:aCommandPath withArguments:argString fileDescriptors:fdArray closeDescriptors:closeFdArray fork:doFork newPgrp:newPgrp inDirectory:aDirectory
  2662     "Internal lowLevel entry for combined fork & exec for WIN32
  2725     "Internal lowLevel entry for combined fork & exec for WIN32
  2663 
  2726 
  3014     |ret in out err shellAndArgs errStream outStream inStream|
  3077     |ret in out err shellAndArgs errStream outStream inStream|
  3015 
  3078 
  3016     aCommandString isNil ifTrue:[^ nil].
  3079     aCommandString isNil ifTrue:[^ nil].
  3017 
  3080 
  3018     anExternalInStream notNil ifTrue:[
  3081     anExternalInStream notNil ifTrue:[
  3019 	in := anExternalInStream fileDescriptor.
  3082         in := anExternalInStream fileDescriptor.
  3020     ] ifFalse:[
  3083     ] ifFalse:[
  3021 	self isMSWINDOWSNTlike ifTrue:[
  3084         self isMSWINDOWSNTlike ifTrue:[
  3022 	    inStream := 'nul' asFilename readStream.
  3085             inStream := 'nul' asFilename readStream.
  3023 	    inStream notNil ifTrue:[
  3086             inStream notNil ifTrue:[
  3024 		in := inStream fileDescriptor.
  3087                 in := inStream fileDescriptor.
  3025 	    ]
  3088             ]
  3026 	]
  3089         ]
  3027     ].
  3090     ].
  3028     anExternalOutStream notNil ifTrue:[
  3091     anExternalOutStream notNil ifTrue:[
  3029 	out := anExternalOutStream fileDescriptor.
  3092         out := anExternalOutStream fileDescriptor.
  3030     ] ifFalse:[
  3093     ] ifFalse:[
  3031 	self isMSWINDOWSNTlike ifTrue:[
  3094         self isMSWINDOWSNTlike ifTrue:[
  3032 	    outStream := 'nul' asFilename writeStream.
  3095             outStream := 'nul' asFilename writeStream.
  3033 	    outStream notNil ifTrue:[
  3096             outStream notNil ifTrue:[
  3034 		out := outStream fileDescriptor.
  3097                 out := outStream fileDescriptor.
  3035 	    ]
  3098             ]
  3036 	]
  3099         ]
  3037     ].
  3100     ].
  3038     anExternalErrStream notNil ifTrue:[
  3101     anExternalErrStream notNil ifTrue:[
  3039 	err := anExternalErrStream fileDescriptor.
  3102         err := anExternalErrStream fileDescriptor.
  3040     ] ifFalse:[
  3103     ] ifFalse:[
  3041 	self isMSWINDOWSNTlike ifTrue:[
  3104         self isMSWINDOWSNTlike ifTrue:[
  3042 	    errStream := 'nul' asFilename writeStream.
  3105             errStream := 'nul' asFilename writeStream.
  3043 	    errStream notNil ifTrue:[
  3106             errStream notNil ifTrue:[
  3044 		err := errStream fileDescriptor.
  3107                 err := errStream fileDescriptor.
  3045 	    ]
  3108             ]
  3046 	]
  3109         ]
  3047     ].
  3110     ].
  3048 
  3111 
  3049     shellAndArgs := self commandAndArgsForOSCommand:aCommandString.
  3112     shellAndArgs := self commandAndArgsForOSCommand:aCommandString.
  3050     ret := self
  3113     ret := self
  3051 	exec:(shellAndArgs at:1)
  3114         exec:(shellAndArgs at:1)
  3052 	withArguments:(shellAndArgs at:2)
  3115         withArguments:(shellAndArgs at:2)
  3053 	fileDescriptors:(Array with:in with:out with:err)
  3116         environment:nil
  3054 	closeDescriptors:nil
  3117         fileDescriptors:(Array with:in with:out with:err)
  3055 	fork:true
  3118         closeDescriptors:nil
  3056 	newPgrp:false
  3119         fork:true
  3057 	inDirectory:dirOrNil.
  3120         newPgrp:false
       
  3121         inDirectory:dirOrNil.
  3058 
  3122 
  3059     inStream notNil ifTrue:[
  3123     inStream notNil ifTrue:[
  3060 	inStream close
  3124         inStream close
  3061     ].
  3125     ].
  3062     outStream notNil ifTrue:[
  3126     outStream notNil ifTrue:[
  3063 	outStream close
  3127         outStream close
  3064     ].
  3128     ].
  3065     errStream notNil ifTrue:[
  3129     errStream notNil ifTrue:[
  3066 	errStream close
  3130         errStream close
  3067     ].
  3131     ].
  3068     ^ ret
  3132     ^ ret
  3069 
  3133 
  3070     "Created: / 10.11.1998 / 20:48:35 / cg"
  3134     "Created: / 10.11.1998 / 20:48:35 / cg"
  3071     "Modified: / 19.5.1999 / 10:43:01 / cg"
  3135     "Modified: / 19.5.1999 / 10:43:01 / cg"
  3816     |info type mode uid gid size id 
  3880     |info type mode uid gid size id 
  3817      atime mtime ctime 
  3881      atime mtime ctime 
  3818      aYr aMon aDay aHr aMin aSec aMS
  3882      aYr aMon aDay aHr aMin aSec aMS
  3819      mYr mMon mDay mHr mMin mSec mMS
  3883      mYr mMon mDay mHr mMin mSec mMS
  3820      cYr cMon cDay cHr cMin cSec cMS
  3884      cYr cMon cDay cHr cMin cSec cMS
  3821      name2|
  3885      fileName alternativeName|
  3822 
  3886 
  3823 %{
  3887 %{
  3824     struct stat buf;
  3888     struct stat buf;
  3825     int ret;
  3889     int ret;
  3826     char nameBuffer[15];
  3890     char alternativeFileNameBuffer[15];
       
  3891     char fileNameBuffer[MAX_PATH+1];
       
  3892 
  3827     unsigned INT ino;
  3893     unsigned INT ino;
  3828 
  3894 
  3829     if (__isString(aPathName)) {
  3895     if (__isString(aPathName)) {
  3830         HANDLE hFile;
  3896         HANDLE hFile;
  3831         SYSTEMTIME creationTime;
  3897         SYSTEMTIME creationTime;
  3856             FindClose(hFile);
  3922             FindClose(hFile);
  3857 
  3923 
  3858             id = __MKSMALLINT(0);   /* could get it by opening ... */
  3924             id = __MKSMALLINT(0);   /* could get it by opening ... */
  3859             size = __MKLARGEINT64(1, findStruct.nFileSizeLow, findStruct.nFileSizeHigh);
  3925             size = __MKLARGEINT64(1, findStruct.nFileSizeLow, findStruct.nFileSizeHigh);
  3860 
  3926 
       
  3927             if (findStruct.cFileName[0] != '\0') {
       
  3928                 bcopy(findStruct.cFileName, fileNameBuffer, MAX_PATH);
       
  3929                 fileNameBuffer[MAX_PATH] = '\0';
       
  3930                 fileName = __MKSTRING(fileNameBuffer);             /* FULL name */
       
  3931             }
       
  3932 
  3861             if (findStruct.cAlternateFileName[0] != '\0') {
  3933             if (findStruct.cAlternateFileName[0] != '\0') {
  3862                 bcopy(findStruct.cAlternateFileName, nameBuffer, 14);
  3934                 bcopy(findStruct.cAlternateFileName, alternativeFileNameBuffer, 14);
  3863                 nameBuffer[14] = '\0';
  3935                 alternativeFileNameBuffer[14] = '\0';
  3864                 name2 = __MKSTRING(nameBuffer); /* DOS name */
  3936                 alternativeName = __MKSTRING(alternativeFileNameBuffer); /* DOS name */
  3865             }
  3937             }
  3866 
  3938 
  3867             /*
  3939             /*
  3868              * simulate access bits
  3940              * simulate access bits
  3869              */
  3941              */
  3945                     size:size 
  4017                     size:size 
  3946                     id:id 
  4018                     id:id 
  3947                     accessed:atime 
  4019                     accessed:atime 
  3948                     modified:mtime 
  4020                     modified:mtime 
  3949                     created:ctime
  4021                     created:ctime
  3950                     path:nil
  4022                     path:nil            
  3951                     alternativeName:name2.
  4023                     fullName:fileName    
       
  4024                     alternativeName:alternativeName.
  3952         ^ info
  4025         ^ info
  3953    ].
  4026    ].
  3954    ^ nil
  4027    ^ nil
  3955 
  4028 
  3956    "
  4029    "
  7325 type:t mode:m uid:u gid:g size:s id:i accessed:aT modified:mT created:cT path:lP alternativeName:name2
  7398 type:t mode:m uid:u gid:g size:s id:i accessed:aT modified:mT created:cT path:lP alternativeName:name2
  7326     ^ self basicNew
  7399     ^ self basicNew
  7327         type:t mode:m uid:u gid:g size:s 
  7400         type:t mode:m uid:u gid:g size:s 
  7328         id:i accessed:aT modified:mT created:cT 
  7401         id:i accessed:aT modified:mT created:cT 
  7329         path:lP alternativeName:name2
  7402         path:lP alternativeName:name2
       
  7403 !
       
  7404 
       
  7405 type:t mode:m uid:u gid:g size:s id:i accessed:aT modified:mT created:cT path:lP fullName:fullName alternativeName:name2
       
  7406     ^ self basicNew
       
  7407         type:t mode:m uid:u gid:g size:s 
       
  7408         id:i accessed:aT modified:mT created:cT 
       
  7409         path:lP 
       
  7410         fullName:fullName
       
  7411         alternativeName:name2
  7330 ! !
  7412 ! !
  7331 
  7413 
  7332 !Win32OperatingSystem::FileStatusInfo methodsFor:'accessing'!
  7414 !Win32OperatingSystem::FileStatusInfo methodsFor:'accessing'!
  7333 
  7415 
  7334 accessTime
  7416 accessTime
  7360 
  7442 
  7361 fixedHeaderSize
  7443 fixedHeaderSize
  7362     "return the fixedHeaderSize (VMS only; nil everywhere else)"
  7444     "return the fixedHeaderSize (VMS only; nil everywhere else)"
  7363 
  7445 
  7364     ^ nil
  7446     ^ nil
       
  7447 !
       
  7448 
       
  7449 fullName
       
  7450     "return the files real name (non-DOS name on windows).
       
  7451      Nil if there is no other name"
       
  7452 
       
  7453     ^ fullName
  7365 !
  7454 !
  7366 
  7455 
  7367 gid
  7456 gid
  7368     "return gid"
  7457     "return gid"
  7369 
  7458 
  7497     id := i.
  7586     id := i.
  7498     accessed := aT.
  7587     accessed := aT.
  7499     modified := mT.
  7588     modified := mT.
  7500     created := cT.
  7589     created := cT.
  7501     path := lP.
  7590     path := lP.
       
  7591     alternativeName := name2.
       
  7592 !
       
  7593 
       
  7594 type:t mode:m uid:u gid:g size:s id:i accessed:aT modified:mT created:cT path:lP fullName:name1 alternativeName:name2
       
  7595     type := t.
       
  7596     mode := m.
       
  7597     uid := u.
       
  7598     gid := g.
       
  7599     size := s.
       
  7600     id := i.
       
  7601     accessed := aT.
       
  7602     modified := mT.
       
  7603     created := cT.
       
  7604     path := lP.
       
  7605     fullName := name1.    
  7502     alternativeName := name2.
  7606     alternativeName := name2.
  7503 ! !
  7607 ! !
  7504 
  7608 
  7505 !Win32OperatingSystem::FileStatusInfo methodsFor:'queries'!
  7609 !Win32OperatingSystem::FileStatusInfo methodsFor:'queries'!
  7506 
  7610 
  8671     libraries...
  8775     libraries...
  8672 "
  8776 "
  8673 !
  8777 !
  8674 
  8778 
  8675 version
  8779 version
  8676     ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.117 2002-10-14 09:54:35 cg Exp $'
  8780     ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.118 2003-02-25 18:43:44 penk Exp $'
  8677 ! !
  8781 ! !
  8678 
  8782 
  8679 !Win32OperatingSystem::Win32FILEHandle methodsFor:'release'!
  8783 !Win32OperatingSystem::Win32FILEHandle methodsFor:'release'!
  8680 
  8784 
  8681 closeFile
  8785 closeFile
  8698     I represent a generic HANDLE, which can be closed via CloseHandle.
  8802     I represent a generic HANDLE, which can be closed via CloseHandle.
  8699 "
  8803 "
  8700 !
  8804 !
  8701 
  8805 
  8702 version
  8806 version
  8703     ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.117 2002-10-14 09:54:35 cg Exp $'
  8807     ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.118 2003-02-25 18:43:44 penk Exp $'
  8704 ! !
  8808 ! !
  8705 
  8809 
  8706 !Win32OperatingSystem::Win32Handle methodsFor:'io'!
  8810 !Win32OperatingSystem::Win32Handle methodsFor:'io'!
  8707 
  8811 
  8708 readBytes:count into:aByteBuffer startingAt:firstIndex
  8812 readBytes:count into:aByteBuffer startingAt:firstIndex
  9085 ! !
  9189 ! !
  9086 
  9190 
  9087 !Win32OperatingSystem class methodsFor:'documentation'!
  9191 !Win32OperatingSystem class methodsFor:'documentation'!
  9088 
  9192 
  9089 version
  9193 version
  9090     ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.117 2002-10-14 09:54:35 cg Exp $'
  9194     ^ '$Header: /cvs/stx/stx/libbasic/Win32OperatingSystem.st,v 1.118 2003-02-25 18:43:44 penk Exp $'
  9091 ! !
  9195 ! !
  9092 
  9196 
  9093 Win32OperatingSystem initialize!
  9197 Win32OperatingSystem initialize!
  9094 Win32OperatingSystem::RegistryEntry initialize!
  9198 Win32OperatingSystem::RegistryEntry initialize!