Page 1 of 2

Hide Drives and Partitions

Posted: Mon Aug 28, 2006 6:00 pm
by Silvio
I must change the Registry at :
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\explorer

at the option NoDrives
and set wich drive I want hide but on the microsoft manual I saw these parameters :

----------------------------------------------------------------------
The values for each drive are as follows:

1 - A I Q Y
2 - B J R Z
4 - C K S
8 - D L T
16 - E M U
32 - F N V
64 - G O W
80 - H P X

So, let's say you want to hide drive D. In the first column you would put "08". For drive K you would put "04" in the second column.
But what if you want to hide more than one drive in a column? Simply add the values together: D+E = 8+16 = 24. So in the first column you would put "24".

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

But I KNOW How set this variable in a program with xharbour and fivewin

there is someone can help me ?

Best Regards

Posted: Mon Aug 28, 2006 7:33 pm
by Detlef Hoefner
Hi Silvio,

this remembers me to riddle inside of Monkey Island :wink:

Maybe the following could help you.

Code: Select all

The NoDrives value can be used to selectively hide drives because the rightmost bit of this hexadecimal value represents the A: drive, and the leftmost bit represents the Z: drive. To hide a specific drive, turn on its bit. Use the following decimal numbers to hide the given drive:

A: 1, B: 2, C: 4, D: 8, E: 16, F: 32, G: 64, H: 128, I: 256, J: 512, K: 1024, L: 2048, M: 4096, N: 8192, O: 16384, P: 32768, Q: 65536, R: 131072, S: 262144, T: 524288, U: 1048576, V: 2097152, W: 4194304, X: 8388608, Y: 16777216, Z: 33554432, ALL: 67108863.
Best regards,
Detlef

Posted: Tue Aug 29, 2006 8:25 am
by Silvio
ok but using the Treg class How I must make to hide hard disk and then show it ?
I'm afraid to make a bad work making errors with treg class and then my pc not run well
Can you hel me pls
Regards

Posted: Tue Aug 29, 2006 9:32 am
by Detlef Hoefner
Silvio,

the only problem is how to create a 26-bit binary string.
You may google yourself or have a look at http://support.microsoft.com/default.as ... -us;231289

Here an extract :

Code: Select all

This policy displays only specified drives on the client computer. The registry key that this policy affects uses a decimal number that corresponds to a 26-bit binary string, with each bit representing a drive letter:

11111111111111111111111111
ZYXWVUTSRQPONMLKJIHGFEDCBA
				
This configuration corresponds to 67108863 in decimal and hides all drives. If you want to hide drive C, make the third-lowest bit a 1, and then convert the binary string to decimal. 

It is not necessary to create an option to show all drives, because clearing the check box deletes the "NoDrives" entry entirely, and all drives are automatically shown. 

If you want to configure this policy to show a different combination of drives, create the appropriate binary string, convert to decimal, and add a new entry to the ITEMLIST section with a corresponding [strings] entry. For example, to hide drives L, M, N, and O, create the following string

00000000000111100000000000
ZYXWVUTSRQPONMLKJIHGFEDCBA
				
and convert to decimal. This binary string converts to 30720 in decimal. Add this line to the [strings] section in the System.adm file: LMNO_Only="Restrict L, M, N and O drives only"
Or you could try a tool like Tweak XP to see how the reg key is changed when hiding certain drives.

Regards,
Detlef

Posted: Tue Aug 29, 2006 2:36 pm
by Detlef Hoefner
Silvio,

please stop writing to my private mailaddress.
It's better that more people than only you may benefit from this forum.

So here is what you asked me for. IMO, you could have googled this yourself.

HKEY_CLASSES_ROOT = 2147483648
HKEY_CURRENT_USER = 2147483649
HKEY_LOCAL_MACHINE = 2147483650
HKEY_USERS = 2147483651
HKEY_CURRENT_CONFIG = 2147483653

Posted: Tue Aug 29, 2006 3:07 pm
by Silvio
>It's better that more people than only you may benefit from this forum. ...

you're right but there are many people help me never if you go at this forum there are many many my messages of which I have not had answer....

Posted: Tue Aug 29, 2006 3:11 pm
by Silvio
for hard disk i saw i must insert this :

4294967291 for drive C
4294967293 for drive D
4294967294 for drive A

but when I insert it I can see these drives : why ?

Infact I open regedit and insert 4294967291 for drive C on nodrives
and the I make this program :

Code: Select all


// Managing Register services from FiveWin

#ifndef __XPP__
   #define  HKEY_CLASSES_ROOT       2147483648
   #define  HKEY_CURRENT_USER       2147483649
   #define  HKEY_LOCAL_MACHINE      2147483650
   #define  HKEY_USERS              2147483651
   #define  HKEY_PERFORMANCE_DATA   2147483652
   #define  HKEY_CURRENT_CONFIG     2147483653
   #define  HKEY_DYN_DATA           2147483654
#else
   #define  HKEY_CLASSES_ROOT       1
   #define  HKEY_CURRENT_USER       2
   #define  HKEY_LOCAL_MACHINE      3
   #define  HKEY_USERS              4
   #define  HKEY_PERFORMANCE_DATA   5
   #define  HKEY_CURRENT_CONFIG     6
   #define  HKEY_DYN_DATA           7
#endif

//---------------------------------------------------------------------------//

function Main()

   local nHandle, cValue

   if RegOpenKey( HKEY_CURRENT_USER ,;
         "Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", @nHandle ) == 0

      RegQueryValue( nHandle, "NoDrives", @cValue )
      MsgInfo( cValue )
      RegCloseKey( nHandle )
   else
      MsgAlert( "Can't open this key" )
   endif

return nil
but it return me a symbol ...why ?

Posted: Tue Aug 29, 2006 4:00 pm
by Detlef Hoefner
Silvio,
for hard disk i saw i must insert this :

4294967291 for drive C
4294967293 for drive D
4294967294 for drive A

how did you get these values?

here again:

Code: Select all

how to hide drive 'C' ( which is very foolish )

ZYXWVUTSRQPONMLKJIHGFEDCBA ( all drive letters )
00000000000000000000000100 ( binary settings )
you'll have to put '4'     ( decimal value of above binary )


Better for testing try to hide drive 'D'

ZYXWVUTSRQPONMLKJIHGFEDCBA ( all drive letters )
00000000000000000000001000 ( binary setting )
you'll have to put '8'     ( decimal value of above binary )

And here an example for hiding drives 'E' and 'D'

ZYXWVUTSRQPONMLKJIHGFEDCBA ( all drive letters )
00000000000000000000001100 ( binary setting )
you'll have to put '12'    ( decimal value of above binary )
So you see how it's easy:
you write down all possible drive letters from A to Z beginning with 'Z'.
Then you replace all drive letters you want to see with a '0' and replace all letters you want to hide with a '1'.
After replacing all letters with the numeric equivalent you got a string representing a binary number. This you'll have to convert to a decimal number and write this value into your reg-key.

BTW, i found it very unpleasant if you complain about missing help from this forum.

I saw a lot of people which were busy during the last weeks by answering your questions.
Remember, no one is obliged to help, but a lot of FiveWinners do.
Even if they are busy with their jobs.

Regards,
Detlef

Posted: Tue Aug 29, 2006 5:13 pm
by Silvio
Sorry YOu are right for all

but...but... but..
I not understand and I not Know how I can make it translating in code ( harbour/fw)...

Posted: Wed Aug 30, 2006 4:24 am
by AlexSchaft
To convert numbers, you can use the following functions:

Code: Select all

Function Dec2x(pnNo, pnBase)

  Local cRetVal              := ""
  Local nCount               := 0
  Local acDigits             := {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
  Local nNo                  := 0

  For nCount := 65 to 65 + pnBase - 11
    aadd(acDigits, chr(nCount))
  Next

  For nCount := 7 to 0 step - 1
    nNo                      := int(pnNo / (pnBase**nCount))
    If nNo > 0 .or. !empty(cRetVal)
      cRetVal                += acDigits[nNo + 1]

      pnNo                   -= nNo * pnBase**nCount
    Endif
  Next

Return cRetval

//------------------------------------------------------------------------------------------------------//
Function x2dec(pcNo, pnBase, plNoWarningMsg)

  Local nRetVal              := 0
  Local nPos                 := 0
  Local acDigits             := {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
  Local nCount               := 0
  Local nStop                := 0
  Local cDigit               := ""

  DEFAULT plNoWarningMsg     TO .t.

  For nCount := 65 to 65 + pnBase - 11
    aadd(acDigits, chr(nCount))
  Next

  nStop                      := len(pcNo)
  For nCount := 1 to nStop
    cDigit                   := substr(pcNo, nStop - nCount + 1, 1)

    nPos                     := ascan(acDigits, cDigit)

    If nPos > 0
      nRetval                += (nPos - 1) * (pnBase ** (nCount - 1))

    Elseif !plNoWarningMsg
      // pk 20/9/2002 msginfo("Invalid number " + pcNo + " " + alias() + " " + NTRIM(recno()))
      msginfo("Warning - function x2dec(), invalid parameter value " + pcNo, "Warning")

    Endif

  Next

  nRetval                    := int(nRetval)

Return nRetval
And for the registry part

Code: Select all


#define HKEY_CURRENT_USER   -2147483647  // 2147483649

oReg := TReg32():New(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\explorer")

oReg:Set("NoDrives", ltrim(str((nNumber)))

oReg:End()

Not sure how to set the entry type though

Posted: Wed Aug 30, 2006 7:01 am
by Detlef Hoefner
Silvio,

here a small function for getting the numeric value for hiding drives.

Code: Select all

PROCEDURE Main()
   cls

   ? nDriveNum( "EDA" ) // getting number to hide drives E, D and A
   ?
RETURN

/////////////////////////////
FUNCTION nDriveNum( cDrives )
/////////////////////////////
LOCAL nRet := 0
LOCAL n    := 0



   for n := 1 to len( cDrives )
      nRet += 2 ^( asc( upper( substr( cDrives, n, 1 ) ) ) - 65 )
   next

RETURN( int( nRet ) )
You just have to call this function with a string containing the drive letter(s) you want to hide.

HTH,
regards,
Detlef

P.S. my recent example for hiding drives 'E' and 'D' was wrong.
The value should have been 24.

Posted: Wed Aug 30, 2006 8:20 am
by Silvio
thanks for all
I will make treasure of your instructions ...


Dear alex thanks

Dear Detlef Hoefner,
you sad to put "4" on variable Nodrives ..
I open regedit and insert 4 on nodrives the f5 to update
then I saw it not run because I can see hard disk C
Is it possible that number 4 is wrong ?.

Posted: Wed Aug 30, 2006 8:37 am
by Silvio
look this and try ( i havewin xp professional :

Code: Select all

#INCLUDE "fivewin.ch"

  #define HKEY_CURRENT_USER   -2147483647  // 2147483649

PROCEDURE Main() 
   cls 

   ? nDriveNum( "C" ) // getting number to hide drives E, D and A
   ?
   registra(nDriveNum( "C" ))
RETURN

/////////////////////////////
FUNCTION nDriveNum( cDrives )
/////////////////////////////
LOCAL nRet := 0
LOCAL n    := 0



   for n := 1 to len( cDrives )
      nRet += 2 ^( asc( upper( substr( cDrives, n, 1 ) ) ) - 65 )
   next

   RETURN( int( nRet ) )
FUNCTION registra(nNumber)


oReg := TReg32():New(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\explorer")

oReg:Set("NoDrives", nNumber)

oReg:Close()

RETURN nil
it insert number 4 on regedit but when I open explorer I can see hard disk C why ?

Posted: Wed Aug 30, 2006 8:55 am
by AlexSchaft
According to one web site, you need to restart windows

Google is your friend :)

http://www.winguides.com/registry/display.php/148/

Posted: Wed Aug 30, 2006 10:22 am
by Silvio
I cannot restart windows
there is a possibility to restart using an function ?
If I restart the program ?
it must be made without restart window ...then If I want to show disc C I must restart window...