Recent Posts

Pages: [1] 2 3 ... 10
1
The Workshop / Re: My third 64 bit console app...
« Last post by hutch-- on Today at 01:05:24 PM »
 :biggrin:

Now you know why I bothered to write an adjustable stackframe macro for procedure entry and exit. With Win32 using ML.EXE a procedure was a simple construction, MASM automatically produced the entry and exit to a procedure which you could override if you did not want a stack frame but ML64 does not do that as the 64 bit calling convention is a lot more complicated. With procedures over 4 arguments you need a stack frame if you are not immediately aware of the stack location for passed arguments and with a stack frame you can directly allocate LOCAL variables to do sensible things like preserve and restore registers.

The point with the stackframe macro was that it ensured correct alignment without having to try and twiddle the stack manually.

To call a procedure I wrote the macro "procedure_call" and use a number of wrappers to call it ("invoke" and a few others) that puts the arguments in the right place, handles the copying of the first 4 args into shadow space then loads the rest of the arguments (if there is more than 4) into the correct stack locations.

Once you have the two macros working together the stackframe procedure can be used in a simple and reliable manner with the arguments in the right place and as many LOCAL variables as you need.
2
The Campus / Re: converting 32 bit code to 64 bit
« Last post by zedd151 on Today at 09:43:31 AM »
looking at it again, the bitmaps are also not getting loaded. I'm trying to figure this out  :icon_confused:

edit --

Probably a register preservation issue.  ;) The code above only preserves registers 32 bit style. lemme see if I can rewrite some of the code...
3
The Campus / Re: converting 32 bit code to 64 bit
« Last post by zedd151 on Today at 09:37:07 AM »
Here's a 'converted' example that doesn't fully work. It has been literally converted from 32 bit. It assembles and links okay with the bat file
but hangs during 'board' creation while trying to run.   :(

This very same program was used as a compatibility test for os's other than windows xp. It ran well as 32 bit program, and I can't figure out
what the exact problem. I know its stuck in a loop, and I tried changing rip to get out of the loop in debugger, window displays, but just a
black background.


Code: [Select]


        include \masm32\include64\masm64rt.inc


; ##############################################################################

        WinMain         proto :qword
        WndProc         proto :qword, :qword, :qword, :qword
        randb           proto :qword
        set_board       proto :qword, :qword
        find_mt         proto :qword, :qword
        painting        proto :qword, :qword, :qword
        moveit          proto :qword, :qword, :qword, :qword, :qword, :qword, :qword

; ##############################################################################

    .data
        CommandLine     dq 0
        hWnd            dq 0
        hInstance       dq 0
       
        Wwd             dq 262
        Wht             dq 288
       
        hBmp0           dq 0
        hBmp1           dq 0
        hBmp2           dq 0
        hBmp3           dq 0
        hBmp4           dq 0
        hBmp5           dq 0
        hBmp6           dq 0
        hBmp7           dq 0
        hBmp8           dq 0
        hBmp9           dq 0
        hBmp10          dq 0
        hBmp11          dq 0
        hBmp12          dq 0
        hBmp13          dq 0
        hBmp14          dq 0
        hBmp15          dq 0
       
        sqct            db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                       
        board           db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0
                        db 0

        mtoffset        db 0
                       
        szClassName     db "Game_Class", 0
        szDisplayName   db "4x4 Game", 0

; ##############################################################################

    .code

    entry_point proc
        invoke GetModuleHandle, 0
        mov hInstance, rax
        invoke WinMain, hInstance
        invoke ExitProcess, 0
    entry_point endp
; ##############################################################################

    WinMain proc hInst:qword
    local wc:WNDCLASSEX, msg:MSG, Wtx:qword, Wty:qword
   
    ; --------------------------------------------------
    ; fill the WNDCLASSEX structure with needed data
    ; --------------------------------------------------
   
        mov wc.cbSize, sizeof WNDCLASSEX
        mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
        lea rax, WndProc
        mov wc.lpfnWndProc, rax
        mov wc.cbClsExtra, 0
        mov wc.cbWndExtra, 0
        push hInst
        pop wc.hInstance
        mov wc.lpszMenuName, 0
        lea rax, szClassName
        mov wc.lpszClassName, rax
       
    ; --------------------------------------------------
    ; set background color
    ; --------------------------------------------------
   
        invoke CreateSolidBrush, 0
        mov wc.hbrBackground, rax

    ; --------------------------------------------------
    ; load icon
    ; --------------------------------------------------
   
        invoke LoadIcon, hInst, 1234
        mov wc.hIcon, rax

        ; use same handle for small icon
   
        push wc.hIcon
        pop wc.hIconSm
       
    ; --------------------------------------------------
    ; load cursor
    ; --------------------------------------------------
   
        invoke LoadCursor, 0, IDC_ARROW
        mov wc.hCursor, rax


    ; --------------------------------------------------
    ; register class
    ; --------------------------------------------------
   
        invoke RegisterClassEx, addr wc

    ; --------------------------------------------------
    ; center window to screen
    ; --------------------------------------------------
   
        invoke GetSystemMetrics, SM_CXSCREEN
        shr rax, 1
        mov rdx, Wwd
        shr rdx, 1
        sub rax, rdx
        mov Wtx, rax
       
        invoke GetSystemMetrics, SM_CYSCREEN
        shr rax, 1
        mov rdx, Wht
        shr rdx, 1
        sub rax, rdx
        mov Wty, rax

    ; --------------------------------------------------
    ; create main window
    ; --------------------------------------------------
   
        invoke CreateWindowEx, 0, addr szClassName, addr szDisplayName, \
                                WS_CAPTION or WS_SYSMENU or WS_VISIBLE, \
                                Wtx, Wty, Wwd, Wht, 0, 0, hInst, 0
           
        mov hWnd, rax
       
    ; --------------------------------------------------
    ; show & update window
    ; --------------------------------------------------

        invoke ShowWindow, hWnd, SW_SHOWNORMAL
        invoke UpdateWindow, hWnd
       
    ; --------------------------------------------------
    ; message dispatcher
    ; --------------------------------------------------
   
    StartLoop:
        invoke GetMessage, addr msg, 0, 0, 0
        cmp rax, 0
       
        je ExitLoop
            invoke TranslateMessage, addr msg
            invoke DispatchMessage, addr msg
    jmp StartLoop
        ExitLoop:
       
    ; --------------------------------------------------
    ; exit winmain
    ; --------------------------------------------------
 ;         mov rax, msg.wParam
        ret
    WinMain endp
   
; ##############################################################################
align 10h
    WndProc proc hWin:qword, uMsg:qword, wParam:qword, lParam:qword
   
        .if uMsg == WM_CREATE
       
        invoke seed_rrand, 123456786   ;;;;; <--- for use with rrand
       
; ------------------------------------------------------------------------------
; load bitmaps, obtain handles
; ------------------------------------------------------------------------------

        invoke LoadBitmap, hInstance, 100
        mov hBmp0, rax          ; for the 'empty' square
       
        invoke LoadBitmap, hInstance, 101
        mov hBmp1, rax          ; handle # is also the pieces' number,
                                ; for this one and the rest
                               
        invoke LoadBitmap, hInstance, 102
        mov hBmp2, rax
       
        invoke LoadBitmap, hInstance, 103
        mov hBmp3, rax
       
        invoke LoadBitmap, hInstance, 104
        mov hBmp4, rax
       
        invoke LoadBitmap, hInstance, 105
        mov hBmp5, rax
       
        invoke LoadBitmap, hInstance, 106
        mov hBmp6, rax
       
        invoke LoadBitmap, hInstance, 107
        mov hBmp7, rax
       
        invoke LoadBitmap, hInstance, 108
        mov hBmp8, rax
       
        invoke LoadBitmap, hInstance, 109
        mov hBmp9, rax
       
        invoke LoadBitmap, hInstance, 110
        mov hBmp10, rax
       
        invoke LoadBitmap, hInstance, 111
        mov hBmp11, rax
       
        invoke LoadBitmap, hInstance, 112
        mov hBmp12, rax
       
        invoke LoadBitmap, hInstance, 113
        mov hBmp13, rax
       
        invoke LoadBitmap, hInstance, 114
        mov hBmp14, rax
       
        invoke LoadBitmap, hInstance, 115
        mov hBmp15, rax

; ------------------------------------------------------------------------------
; randomly set board with random numbered game pieces
; ------------------------------------------------------------------------------

        invoke set_board, addr board, addr sqct
       
; ------------------------------------------------------------------------------
; locate the empty square and save the offset to it
; ------------------------------------------------------------------------------

        invoke find_mt, addr board, addr mtoffset

        .elseif uMsg == WM_KEYDOWN
       
            .if wParam == VK_LEFT
           
                ; moveit - arguments:
                ; ptr Board
                ; offset of empty square
                ; illegal move # 1
                ; illegal move # 2
                ; illegal move # 3
                ; illegal move # 4
                ; offset of piece to move (relative to mt square)
               
                invoke moveit, addr board, mtoffset, 3, 7, 11, 15, 1
               
            .elseif wParam == VK_UP
                invoke moveit, addr board, mtoffset, 12, 13, 14, 15, 4
   
            .elseif wParam == VK_RIGHT
                invoke moveit, addr board, mtoffset, 0, 4, 8, 12, -1
   
            .elseif wParam == VK_DOWN
                invoke moveit, addr board, mtoffset, 0, 1, 2, 3, -4
   
            .elseif wParam == VK_ESCAPE
                invoke SendMessage, hWin, WM_CLOSE, 0, 0
            .endif
           
            invoke find_mt, addr board, addr mtoffset
            invoke painting, hWin, addr board, addr hBmp0
           
        .elseif uMsg == WM_PAINT
            invoke painting, hWin, addr board, addr hBmp0
           
        .elseif uMsg == WM_CLOSE
            invoke PostQuitMessage, 0
           
        .endif
       
        invoke DefWindowProc, hWin, uMsg, wParam, lParam
        ret
    WndProc endp
   
; ##############################################################################
align 10h
    randb proc base:qword           ; simplified version of 'nrand'
    local random_seed:qword         ; not fast, but small and
        invoke GetTickCount         ; adequate for our purposes here.
        add rax, random_seed
        xor rdx, rdx
        mov rcx, 127773
        div rcx
        mov rcx, rax
        mov rax, 432836
        mul rdx
        sub rcx, rax
        xor rdx, rdx
        mov rax, rcx
        mov random_seed, rcx
        div base
        mov rax, rdx
        inc rax
        ret
    randb endp
   
; ##############################################################################
align 10h
    set_board proc pbrd:qword, psqct:qword
        push rsi
        push rdi
        push rbx
        mov rsi, pbrd       ; pointer to byte values representing the game board
        mov rdi, psqct      ; pointer to byte array acting as 'valid piece' counter

; ***************** hangs here*********************

    toppa:
        push rcx

        invoke randb, 16    ; generate random value for location
        pop rcx
        mov rdx, rax
        dec rdx
        push rdx

        invoke randb, 15    ; generate random value for game piece
        pop rdx
        mov rcx, rax
        dec rcx
        ; both of these values must be zero to create a new valid game piece
       
        cmp byte ptr [rdi+rcx], 0   ; check if location is empty
        jnz @f
        cmp byte ptr [rsi+rdx], 0   ; check if piece value is not already used
        jnz @f
       
        mov byte ptr [rsi+rdx], al  ; write new piece value to location
        mov byte ptr [rdi+rcx], 1   ; set counter for piece value to 1
                                    ; indicating the value has been used already

    @@:
        xor rax, rax                ; clear eax for the next step
        xor rcx, rcx                ; clear ecx for the next step
    @@:
        add al, byte ptr [rdi+rcx]  ; adding up all of the piece value counters
        inc rcx
        cmp rcx, 16                 ; check all 16 possible locations
        jl @b
        cmp rax, 15                 ; check all possible piece values
        jnz toppa

;***************************************************
 ; hangs above this line, in the loop
;***************************************************
        pop rbx
        pop rdi
        pop rsi
        ret
    set_board endp

; ##############################################################################
align 10h
    find_mt proc pbrd:qword, pmtoffs:qword
        xor rax, rax                ; simple proc that scans all locations
        mov rcx, pbrd               ; to locate the empty square
    @@:
        cmp byte ptr [rcx+rax], 0
        jz @f
        inc rax
        jmp @b
    @@:
        mov rcx, pmtoffs
        mov [rcx], rax              ; saving the location of the empty square
        ret
    find_mt endp
   
; ##############################################################################
align 10h
    painting proc hWin:qword, pbrd:qword, phndl:qword
    local tX:qword, tY:qword, hDC:qword, hMemDC:qword, ps:PAINTSTRUCT, numb:qword
        push rsi
        push rdi
        push rbx
       
        invoke GetDC, hWin
        mov hDC, rax
        invoke CreateCompatibleDC, NULL
        mov hMemDC, rax

        mov numb, 0
        mov tX, 0
        mov tY, 0
       
    top0:
       
        mov rcx, numb           ; index to location
        mov rdi, phndl          ; pointer to handle array
        mov rsi, pbrd           ; pointer to game board
        xor rdx, rdx            ; counter
        mov dl, [rsi+rcx]       ; get piece value (to be used as index)
        mov eax, [rdi+rdx*8]    ; get handle from array

        invoke SelectObject, hMemDC, rax
        invoke BitBlt, hDC, tX, tY, 64, 64, hMemDC, 0, 0, SRCCOPY
        inc numb
        add tX, 64              ; incrementing tX and tY as dictated
        cmp tX, 256             ; by the location being processed
        jnz @f
        add tY, 64
        mov tX, 0
    @@:
        cmp numb, 16            ; compare if all squares have been processed
        jnz top0

        invoke DeleteDC, hMemDC
        invoke DeleteDC, hDC
        pop rbx
        pop rdi
        pop rsi
        ret
    painting endp

; ##############################################################################
align 10h
    moveit proc pbrd:qword, mt:qword, i1:qword, i2:qword, i3:qword, i4:qword, v7:qword
        push rsi
        push rdi
        mov rsi, pbrd               ; pointer to game board
        mov rcx, mt                 ; pointer to empty square
        cmp rcx, i1                 ; check against illegal move #1
        jz @f
        cmp rcx, i2                 ; check against illegal move #2
        jz @f
        cmp rcx, i3                 ; check against illegal move #3
        jz @f
        cmp rcx, i4                 ; check against illegal move #4
        jz @f
        mov rdi, rcx                ; move empty location to edi
        add rdi, v7                 ; add movement offset
        mov al, [rsi+rcx]           ; swap values of the two squares
        mov dl, [rsi+rdi]           ; source square now becomes the empty square
        mov [rsi+rdi], al           ; empty square now becomes filled with source value
        mov [rsi+rcx], dl
    @@:
        pop rdi
        pop rsi
        ret
    moveit endp

; ##############################################################################
end


The attachment 4x4  Windows Game is for this code (64 bit) The code shows the problem area

The 2nd attachment 4x4 Windows compat test is the original (32 bit) which is fully operational

Running this code in the debugger everything else seems to be in order, but always gets stuck in the same loop 
4
The Orphanage / Re: I'll be buying a new computer...
« Last post by zedd151 on Today at 08:43:13 AM »
...
I'm remembering that I was running windows xp sp3 and that consume only 48mb after initialization...

sounds a lot like mini xp, or similar bootable portable xp (bartpe for example)

Good old windows xp. Got a lot of flack in those days, but it was the most customizable and user friendly operating system.
It didn't complain too much if the user removed a lot of the bulk. (Except for operation 'critical' components)

While I never got xp as small as 48 mb, I did get it down to just under 400 MB. It booted fast in comparison to the default installation.
And restoring backups took hardly any time at all.

But now everyone has to deal with Windows 10 bloatware. But little by little, I'm working on that problem on my end with some success.
5
The Orphanage / Re: I'll be buying a new computer...
« Last post by mineiro on Today at 07:47:56 AM »
I generally try to kill some programs on memory to see what is need or not and feel the consequences. Try to kill scrcs.exe on windows xp and you will see that is not possible (even being admin). Well, it's possible (debug priviledges), but ... (blue screen). Because only I use the computer I don't need a lot of gifts to multiuser, disabled a lot of things.
When I started I was doing a 'dir /s ...'  to list all files on whole hard disk and redirecting output to a text file. After instaled a program and rebooted I was doing the same to another file. The difference between both text files are files inserted by the program. This is not good because instalation programs can delete some files, but I have started this way.
When I tried the same, exporting from registry to text files and comparing to see what was inserted I get in trouble. Regedit was not exporting all keys, have ones that are priviledged, this is how I look to monitors. I carry with me until today old 'windiff' program, so I only need look for colours, red and yellow, this program show difference by lateral bar colors.
This way that I'm talking here is valid to any O.S., but as you can see have faults because are not monitors.
I'm remembering that I was running windows xp sp3 and that consume only 48mb after initialization; well, I stay more than one week erasing, disabling things.
6
The Campus / Re: converting 32 bit code to 64 bit
« Last post by zedd151 on Today at 07:28:27 AM »

Code: [Select]

    include \masm32\include64\masm64rt.inc
    .data
    .data?
    .code

   

    entry_point proc
    invoke MessageBox,0,"Hello World","Title",MB_OK
    invoke ExitProcess, 0
    entry_point endp
   
    end


disassembles to this: (x64dbg.exe)

Code: [Select]

.code
00007FF60F181000 | enter 80,0                                |
00007FF60F181004 | sub rsp,60                                |
00007FF60F181008 | mov rcx,0                                 |
00007FF60F18100F | mov rdx,qword ptr ds:[7FF60F18306C]       | rdx:EntryPoint, 00007FF60F18306C:&"Hello World"
00007FF60F181016 | mov r8,qword ptr ds:[7FF60F183086]        | 00007FF60F183086:&"Title"
00007FF60F18101D | mov r9,0                                  | r9:EntryPoint
00007FF60F181024 | call qword ptr ds:[<&MessageBoxA>]        |
00007FF60F18102A | mov rcx,0                                 |
00007FF60F181031 | call qword ptr ds:[<&ExitProcess>]        |

.data
00007FF60F183000  0D 0A 00 00 30 18 0F F6 7F 00 00 0D 0A 00 0B 30  ....0..ö.......0 
00007FF60F183010  18 0F F6 7F 00 00 09 00 16 30 18 0F F6 7F 00 00  ..ö......0..ö... 
00007FF60F183020  22 00 20 30 18 0F F6 7F 00 00 3C 00 2A 30 18 0F  ". 0..ö...<.*0.. 
00007FF60F183030  F6 7F 00 00 3E 00 34 30 18 0F F6 7F 00 00 21 00  ö...>.40..ö...!. 
00007FF60F183040  3E 30 18 0F F6 7F 00 00 28 00 48 30 18 0F F6 7F  >0..ö...(.H0..ö. 
00007FF60F183050  00 00 29 00 52 30 18 0F F6 7F 00 00 00 00 00 00  ..).R0..ö....... 
00007FF60F183060  48 65 6C 6C 6F 20 57 6F 72 6C 64 00 60 30 18 0F  Hello World.`0.. 
00007FF60F183070  F6 7F 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ö............... 
00007FF60F183080  54 69 74 6C 65 00 80 30 18 0F F6 7F 00 00 00 00  Title..0..ö..... 


So, the converting of the arguments to registers is automatically done by the ?? preprocessor?
And what about the text strings, how and when are they put into the data section. I don't
fully understand.

Ooops, I see that I didn't put a "ret"
7
The Workshop / Re: My third 64 bit console app...
« Last post by mineiro on Today at 07:07:53 AM »
When program is loaded on memory rsp have a value ???????8h, we need subtract 1*8 bytes to align to a multiple of 16, so rsp == ???????0, now we can 'call' an external function (non leaf).
Next is necessary reserve space to shadow space (rcx,rdx,r8,r9), 4*8.
Next is to a function that use more parameters inside your procedure (ReadConsole) that need 1 argument on stack == 1*8.
Sub rsp, 1*8+4*8, so 1(parameter)+4(shadow) == 5, stack aligned (odd + odd rsp == even), it's ok. If even, you can do your own way or just add 8 to that value.
Again, at start of your procedure after you alloc memory to shadow space you can store rcx,rdx,... into that memory variables, not sure if this helps a diagnosis when program have a fault but we ignore that (Exception handler?).

When you push that value you're going from even (???????0) to odd (???????8), any values are ok to a leaf function, but function that call other functions gets in trouble.

edited --- odd and even :)
8
The Workshop / Re: My third 64 bit console app...
« Last post by felipe on Today at 06:58:49 AM »
Thanks again.  :icon14:
9
MASM64 SDK / copy to bin64 batch file
« Last post by zedd151 on Today at 06:26:27 AM »
batch file to simplify moving MS binaries to bin64 folder

Code: [Select]
rem modify paths for your system/folders
rem example: set inpath="D:\x64\bin64"
rem example: set outpath="C:\masm32\bin64"

set inpath="..."
set outpath="..."

set inpath1033="..."
set outpath1033="..."


xcopy %inpath%\cvtres.exe %outpath% /hrky
xcopy %inpath%\dumpbin.exe %outpath% /hrky
xcopy %inpath%\editbin.exe %outpath% /hrky
xcopy %inpath%\lib.exe %outpath% /hrky
xcopy %inpath%\link.exe %outpath% /hrky
xcopy %inpath%\link.exe.config %outpath% /hrky
xcopy %inpath%\ml64.exe %outpath% /hrky
xcopy %inpath%\msobj140.dll %outpath% /hrky
xcopy %inpath%\mspdb140.dll %outpath% /hrky
xcopy %inpath%\mspdbcmf.exe %outpath% /hrky
xcopy %inpath%\mspdbcore.dll %outpath% /hrky
xcopy %inpath%\mspdbsrv.exe %outpath% /hrky
xcopy %inpath%\mspdbst.dll %outpath% /hrky
xcopy %inpath%\mspft140.dll %outpath% /hrky
xcopy %inpath%\msvcdis140.dll %outpath% /hrky
xcopy %inpath%\msvcp140.dll %outpath% /hrky

xcopy %inpath1033%\bscmakeui.dll %outpath1033% /hrky
xcopy %inpath1033%\clui.dll %outpath1033% /hrky
xcopy %inpath1033%\cvtresui.dll %outpath1033% /hrky
xcopy %inpath1033%\linkui.dll %outpath1033% /hrky
xcopy %inpath1033%\LocalESPCui.dll %outpath1033% /hrky
xcopy %inpath1033%\mspdbcmfui.dll %outpath1033% /hrky
xcopy %inpath1033%\mspft140ui.dll %outpath1033% /hrky
xcopy %inpath1033%\pgort140ui.dll %outpath1033% /hrky
xcopy %inpath1033%\pgoui.dll %outpath1033% /hrky
pause


Filenames taken directly from hutch's list of files needed (Microsoft_File_List.txt)
 
Will need to change paths as necessary for your system/masm64 path...

10
The Orphanage / Re: I'll be buying a new computer...
« Last post by zedd151 on Today at 05:11:35 AM »
For those who would like more details for what I have done already...

 The changes I have made to the clean installation of Windows 10 Home:

--------------------------------------------------------------------------------
To enable the hidden "Administrator" account in Windows 10 Home, from an elevated command prompt (run as administrator):

Code: [Select]

Net user administrator /active:yes


To set a password for "Administrator", from an elevated Command Prompt:

Code: [Select]

Net Users Administrator *


and hit Enter. Now you will see new line to type a new password for administrator - and your new Administrator account is all set and ready on the next reboot.

---------------------------------------------------------------------------------
Enabling "Group Policy Editor" in the Home version create a .bat file with the following:

Code: [Select]

@echo off
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >Files.txt
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>Files.txt
echo Installing Group Policy Editor...
for /f %%i in ('findstr /i . Files.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
echo.
echo Installation complete.
echo.
pause

Run from an elevated command prompt. (run as administrator)

Using the above, you enable the Group Policy Editor in Windows 10 Home Edition (8 & 7 too, I believe), which is not enabled by default in the Home version.

----------------------------------------------------------------------------------

The other good thing to use is Easy Context Menu <-- direct download link.
With this program, you can add to the right click context menu "Copy to Folder...", "Move to Folder...",
 and my favorite "Take Ownership", which allows you to delete/change files or folders blocked by "SYSTEM" or "TRUSTEDINSTALLER", plus many
other tweaks.


As a cautionary note: DO NOT MAKE THESE CHANGES unless you have a backup of your system,
and secondly don't do it unless you know what you are doing.

The "Administrator" account enabling is well documented in many places on the internet.

The enabling of "Group Policy Editor" is also well documented...


+++++++++++++++++++++++++++++++++++++++++++++++++++++++

The other changes I have made to MY SYSTEM will not be posted here. Any changes you make
to  Your System are solely your responsibility.


 :biggrin:

Pages: [1] 2 3 ... 10