IPB

Google Frontpage Forums Unattended CD/DVD Guide
 Forum Rules Unattended CD/DVD Guide Homepage · MSFN Forum Rules
> Unlimited number of drivers + keeping the drivers., Exception: MassStorage drivers.
schalti
post Apr 13 2005, 07:26 AM
Post #1


Junior
*

Group: Members
Posts: 65
Joined: 22-July 04
Member No.: 25116
Country Flag


welcome.gif

Normally there is one way to integrate drivers in Windows 2k/xp/2k3.
Specify oempnpdriverspath in winnt.sif / unattend.txt / ristndrd.sif / sysprep.inf or patch the resulting DevicePath Registry Value directly using SetDevicePath.exe by Pyron. The problem is there is a length limit of 4096 characters.

I developed two little scripts which will solve the problem of driver integration in a different way (exception: disk drivers).

Script 1 'drvls.cmd' will scan a subdirectory structure where it sits at the very top for INF-files and call

Script 2 'drvcp.cmd' which will create a temporary INF-file in the subdirectory and for the INF-file passed by 'drvls.cmd'. It will then use the INF command 'CopyINF' to integrate the INF-file in Windows. CopyINF
- creates oem<sequencenumber>.inf in %WINDIR%\inf
--> this is an exact copy of the INF-file to be integrated
- creates oem<sequencenumber>.pnf in %WINDIR%\inf
--> this is a compiled INF-file that contains device-ID(s) and (most important) the full path to the original driver location (that was passed to 'drvcp.cmd' by 'drvls.cmd').
- integrates the signature .cat file (if it exists) in the catalog-DB
Finally it will delete the temporary INF-file.

As a result Windows can successfully install any device driver in the subdirectory structure with the normal PnP mechanism. The subirectory names can be readable and contain Spaces etc. since there is no limit resulting from a Registry Value Length etc.

So there are 5 files needed:
- drvls.cmd
- drvcp.cmd
- header.txt (header for temporary INF-file)
- footer.txt (footer for temporary INF-file, needed for W2K only)
- cocpyinf.dll (CoInstaller DLL, needed for W2K only)

Now I try to post these files to this forum as a ZIP smile.gif .

Any suggestions?

EDIT: 19.4.2005 20:20 -> Script solution REMOVED.

Please use SetupCopyOEMInf.exe from Pyron based on his SetDevicePath.exe and my scripts. Downloadable in this thread. Tested successfully on 2k, xp and 2003. thumbup.gif
Go to the top of the page
 
+Quote Post
5 Pages V  < 1 2 3 4 > »   
Start new topic
Replies (20 - 39)
schalti
post Apr 19 2005, 11:34 AM
Post #21


Junior
*

Group: Members
Posts: 65
Joined: 22-July 04
Member No.: 25116
Country Flag


QUOTE (Bilou_Gateux @ Apr 19 2005, 09:51 AM)
@schalti

just have a try with yours scripts on a Windows 2000 based installation.
don't works as expected for me and just start to debug the process.

...

here a sample of the first I_N_F.inf file created by your script:
CODE
[Version]
Signature = "$CHICAGO$"
Provider  = "schalti"
DriverVer = 01/02/2004, 5.10.2600.0000

[DefaultInstall]
CopyINF=815.INF

[DefaultInstall.CoInstallers]
AddReg=CoInstallers.AddReg
CopyFiles=CoInstallers.CoInstallersCopy

[CoInstallers.AddReg]
HKR,,CoInstallers32,0x10008,"cocpyinf.dll,CoCopyINF"

[CoInstallers.CoInstallersCopy]
cocpyinf.dll,,,0x10


...

And i have edited drvcp.cmd to solve an copy error:
rem W2K only
copy /Y "%~dp0cocpyinf.dll" "%INFPATH%cocpyinf.dll"

before editing the original line
rem copy /Y "%~dp0cocpyinf.dll" "%INFPATH%I_N_F.inf"

the <subdir>\I_N_F.inf file was overwrited with cocpyinf.dll

As i understand, for WIN 2000, the dll should be copied in each subdir where is the I_N_F.inf file before running the command. I'm right?


Sorry for the little mistake in drvcp.cmd. blushing.gif
I developed the script on XP and added w2k support the way M$ describes it on the DDK website.

It is correct that the cocpyinf.dll should be copied where the temporary INF-file is created. REGSVR32 should not be necessary. It may be a good optimization to run the Coinstaller just once. But first of all it has to work in w2k of course.
I run some tests on an unimportant w2k-Server tonite.

@Bilou_Gateux
EDIT: I just tested Pyron's SetupCopyOEMInf.exe on a Windows 2000 Server and it works without problem. So the API call is reliable on 2000, xp and 2003.

So the solution is easy:
- delete my scripts and use Pyron's SetupCopyOEMInf.exe (downloadable in this thread) which is based on SetDevicePath.exe and my scripts.

@Forum Administrator
Is there a way to remove the scripts I uploaded? The solution with the EXE runs faster, too.
EDIT: Ok, I could remove the script solution. Please use SetupCopyOEMInf.exe instead.

thumbup.gif
Go to the top of the page
 
+Quote Post
schalti
post Apr 19 2005, 11:40 AM
Post #22


Junior
*

Group: Members
Posts: 65
Joined: 22-July 04
Member No.: 25116
Country Flag


QUOTE (RogueSpear @ Apr 19 2005, 09:28 AM)
See one of the things that is important to me is being able to either A.) keep the drivers on the HD after the install or B.) have the drivers on the install CD and let the wizard find them there.  Just something so that when someone plugs in a new device it will be enumerated and install properly.  Even if it's not the latest up to date driver, whatever the person had at the time of install would likely be better the MS supplied driver if there is one or the always bloated with crap install CD that vendor seem to be supplying these days (think Dell AIO devices).
*


Option A. works with SetupCopyOEMInf.exe
Option B. will only be possible if the CD is in the drive at the time the new device is installed. I'm not sure if Windows is smart enough to ask for the CD, maybe it is smile.gif . A better idea probably to copy the structure to HD or to use addon-images with drivers (which I do using ZENworks imaging, a great tool).
Go to the top of the page
 
+Quote Post
Bilou_Gateux
post Apr 20 2005, 01:48 AM
Post #23


Powered by Windows Embedded
*****

Group: Members
Posts: 752
Joined: 3-January 04
From: Underworld
Member No.: 11874
OS: XP Pro x86
Country Flag


thumbup.gif This method is awesome.
"One small step for man, one giant leap for drivers UA."

@schalti for discovering and explaining the way to achieve this
@pyron for writing the magic exe

Many, many, many thanks.

No i understand how some manufacturers like Creative installs their WebCam drivers first on my running box and then let me plug the USB cable and let install the Cam without asking for the install media.
Go to the top of the page
 
+Quote Post
Bâshrat the Snea...
post Apr 20 2005, 06:34 AM
Post #24


aka Wim Leers
Group Icon

Group: Patrons
Posts: 2214
Joined: 29-October 03
From: Hasselt, Belgium
Member No.: 8748
OS: none
Country Flag


@Bilou_Gateaux: I agree with your last sentence smile.gif
Go to the top of the page
 
+Quote Post
erik_demon
post Apr 21 2005, 03:57 PM
Post #25


Master Chief
**

Group: Members
Posts: 253
Joined: 22-August 04
From: Lelystad
Member No.: 28465
OS: XP Pro x86
Country Flag


Today I finally had the time to test this new method and I must say: It works SUPERB thumbup.gif

I tested it on a couple of onboard devices, and I even tested it on my video card drivers (this test was from inside windows) It work brilliant!!

Then I tried Bashrat's new driver pack which has this method included. This time it didn't work for me. No device where installed during setup, and no devices where installed when I plugged in new hardware

I used Bashrat's pack method 2 (Pyron's method) with the following presetup.cmd

CODE
REM +===============================================+
REM | Finding CDROM driveletter                     |
REM |-----------------------------------------------|
SET tagfile=\OEM
FOR %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist "%%i:%tagfile%" set CDDRIVE=%%i:


REM +===============================================+
REM | Make sure we are in System32                  |
REM |-----------------------------------------------|
CD /D %SystemRoot%\system32


REM +===============================================+
REM | Decompressing the DriverPacks to the harddisk |
REM |-----------------------------------------------|
CD /D %SystemDrive%
%CDDRIVE%\OEM\bin\7za.exe x -y -aoa %CDDRIVE%\OEM\DriverPack_*.7z -o"%SYSTEMDRIVE%"


REM +===============================================+
REM | Scanning for PERMANENT driverdirectories      |
REM |-----------------------------------------------|
%CDDRIVE%\OEM\bin\SetupCopyOEMInf.exe %SystemDrive%\D


REM +===============================================+
REM | Enable installation of unsigned drivers               |
REM |-----------------------------------------------|
START %CDDRIVE%\OEM\bin\WatchDriverSigningPolicy.exe


EXIT


For some reason, it looks like SetupCopyOEMInf.exe isn't executed during this stage (although I get no errors)

What do you think could be the problem?
Go to the top of the page
 
+Quote Post
schalti
post Apr 21 2005, 04:36 PM
Post #26


Junior
*

Group: Members
Posts: 65
Joined: 22-July 04
Member No.: 25116
Country Flag


QUOTE (erik_demon @ Apr 21 2005, 03:57 PM)
Today I finally had the time to test this new method and I must say: It works SUPERB  thumbup.gif

....

For some reason, it looks like SetupCopyOEMInf.exe isn't executed during this stage (although I get no errors)

What do you think could be the problem?
*


confused.gif
Strange. The API-Call used is inside %WINDIR%\system32\setupapi.dll (SetupCopyOEMInfA for ANSI and SetupCopyOEMInfW for Unicode) which is available at that stage for sure. Maybe the Output-Window? I hope Pyron finds the time to write a version with a silent switch (no Output-Window) and if it still doesn't work to analyze the problem. It is a shame that at this stage debugging is probably quite difficult. Normally I would run regmon and filemon from Sysinternals to find out about failing file or registry access.

Maybe something with the signature? Are the drivers in this Driverpack signed drivers?

Maybe add a "START /WAIT" ?

Is there another stage of the Setup process where it could be started?

unsure.gif
Go to the top of the page
 
+Quote Post
RogueSpear
post Apr 21 2005, 07:51 PM
Post #27


OS: SimplyMEPIS
Group Icon

Group: Normal Sponsors
Posts: 1529
Joined: 18-September 04
From: Buffalo, NY
Member No.: 31429
OS: none
Country Flag


It should work from DetachedProgram.
Go to the top of the page
 
+Quote Post
sixpack
post Apr 22 2005, 02:30 AM
Post #28


Senior Member
****

Group: Members
Posts: 515
Joined: 29-May 04
Member No.: 20982



works great here thumbup.gif
i have questions tho..
can i move the driver folder D to windows folder and if not can i make it a system folder (hide it)?

the topic says "Exception: MassStorage drivers"
so they are not included? or must i delete it before running SetupCopyOEMInf.exe?
Go to the top of the page
 
+Quote Post
erik_demon
post Apr 22 2005, 03:47 AM
Post #29


Master Chief
**

Group: Members
Posts: 253
Joined: 22-August 04
From: Lelystad
Member No.: 28465
OS: XP Pro x86
Country Flag


QUOTE
can i move the driver folder D to windows folder and if not can i make it a system folder (hide it)?


I think so:

If you modify the following lines in your presetup.cmd.

Change this:
CODE
CD /D %SystemDrive%
%CDDRIVE%\OEM\bin\7za.exe x -y -aoa %CDDRIVE%\OEM\DriverPack_*.7z -o"%SYSTEMDRIVE%"

%CDDRIVE%\OEM\bin\SetupCopyOEMInf.exe %SystemDrive%\D


To this:

CODE
CD /D %SystemDrive%
%CDDRIVE%\OEM\bin\7za.exe x -y -aoa %CDDRIVE%\OEM\DriverPack_*.7z -o"%Systemroot%"

%CDDRIVE%\OEM\bin\SetupCopyOEMInf.exe %Systemroot%\D


EDIT: I assumed you used Bashrat's pack like I did

This post has been edited by erik_demon: Apr 22 2005, 03:48 AM
Go to the top of the page
 
+Quote Post
sixpack
post Apr 22 2005, 03:55 AM
Post #30


Senior Member
****

Group: Members
Posts: 515
Joined: 29-May 04
Member No.: 20982



i use Method 1
and make a sfx file and unpacking ad t-39
Go to the top of the page
 
+Quote Post
erik_demon
post Apr 22 2005, 04:08 AM
Post #31


Master Chief
**

Group: Members
Posts: 253
Joined: 22-August 04
From: Lelystad
Member No.: 28465
OS: XP Pro x86
Country Flag


I that case:

let your sfx file extract the files to your %systemroot% folder

And use

CODE
SetupCopyOEMInf.exe %Systemroot%\D


I think this should work
Go to the top of the page
 
+Quote Post
X-Savior
post Apr 22 2005, 05:25 PM
Post #32


Member
**

Group: Members
Posts: 124
Joined: 23-February 05
From: Alberta
Member No.: 45013
Country Flag


Hey All! welcome.gif

Ok, Just finished catching up.

Interesting.... But Why so complicated for the same thing? no.gif

With MY method in creating the CAB PRIOR to install, you can integrate ANY drivers into it. It then does not require entry's in the WINNT.SIF because we no longer have a ton of directory's. Just a single CAB file. With the extra help we have had in our other Thread to run a simple batch to list all the files so we can copy-paste into the DRVINDEX it only take 2 minutes to create a whole new CAB file from scratch with any drivers you want. Then with this method Windows will see the drivers DURING the OS install and install what is required and then POST install if you do any Pn'P it will ALSO detect the drivers.

So I am still confused why we are trying to complicate things further to achieve the same goal..... Or am I missing something? unsure.gif
Go to the top of the page
 
+Quote Post
RogueSpear
post Apr 22 2005, 07:25 PM
Post #33


OS: SimplyMEPIS
Group Icon

Group: Normal Sponsors
Posts: 1529
Joined: 18-September 04
From: Buffalo, NY
Member No.: 31429
OS: none
Country Flag


X-savior, actually I'm wondering the same thing. I made a cab today of all the DPs plus my own DP and it came out to 222MB if I remember correctly. Sure it's a big file, but it's one file instead of thousands. I started thinking about how all of this could or should be implemented. There's going to be a lot of compromise one way or the other. I'll explain:

Using 7-Zip, all the drivers come in at under 150MB. The cab file as I explained above is much larger. Yes I do have a DVD burner and yes I do make a version of my project on DVD. But there are still PLENTY of circumstances where a CD is mandatory. Therefore every last byte counts. So what I'm thinking is that the process could go something like what I do currently, but with a few additions at the end.

Currently I use a modified Method 1. I run the M1 slipstream batch and let it go through all of it's steps modifying the various inf and sif files. Once it's all done, I get rid of the D directory and put the original 7z files in a directory called OEM. From DetachedProgram I call a simple batch file that decompresses the archives to the HD. In a VBscript executed via RunOnceEx, I run the control panels batch and then delete the D directory.

Ok so that's what I do now. What I'd like to do is put in a routine to run from RunOnceEx (or possibly cmdlines.txt) that makes this monster cab file from the contents of D, delete D, and make the necessary changes to the registry and anywhere else so that a future PnP enumeration will look in the custom cab in addition to the stock cab.

I hope this is making sense to some of you out there. I don't always have a flair for explaining things very clear. From what I can tell, we have all of the pieces in place. It's just a matter of implementation. So in conclusion, this would save space on our distribution media since we're still using 7z archives, get the drivers onto the hard drive in time for the initial device install portion of setup, and finally make a nice, neat cab file for future device installations. The only negative I can find so far is that we will still be bound to the 4096 character limitation in the winnt.sif file.

Thoughts? Comments?

Oh yea.. OT but interesting: I discovered today that Viewsonic makes available a single file for download that contains the drivers for dozens of their monitors. Wouldn't it be nice if all monitor manufacturers did this?
Go to the top of the page
 
+Quote Post
erik_demon
post Apr 23 2005, 05:30 AM
Post #34


Master Chief
**

Group: Members
Posts: 253
Joined: 22-August 04
From: Lelystad
Member No.: 28465
OS: XP Pro x86
Country Flag


@X-Savior

I tested this method myself and I now know that this method has some advantages and two big disadvantages:

advantages:
- Windows directly identifies and installs the drivers. With our method, we always needed to tell windows to search for the drivers. With this method this isn’t necessary. (just like you plug in a new USB mouse)

- This is a by Microsoft documented method. This method is already used for some devices (scanners mostly ask to install the software first before you plug & play the device.) This method is stable.

- This method has no problem with double file names: You might think that our method doesn't have this problem either. I'm not so sure about that.

What would happen if their are two device that both use a different version of the file a.sys

Then we would have in our Drvindex.inf:

CODE
[mydriver]
a.sys


How does windows know which file to use??

In this method this is all taken care off.

disadvantages:
- It takes a lot of space on the harddrive, my D folder now is 644 MB, when this is in a .CAB file, it is only 193MB

- It takes some time to run SetupCopyOEMInf.exe With all Bashrat's DP's this could easily take 15 min.

@RogueSpear
QUOTE
What I'd like to do is put in a routine to run from RunOnceEx (or possibly cmdlines.txt) that makes this monster cab file from the contents of D, delete D, and make the necessary changes to the registry and anywhere else so that a future PnP enumeration will look in the custom cab in addition to the stock cab.
This would take a lot of time. About 15 min on every boot. Besides with this method this isn't necessary (only you don't have any compression)

QUOTE
Oh yea.. OT but interesting: I discovered today that Viewsonic makes available a single file for download that contains the drivers for dozens of their monitors. Wouldn't it be nice if all monitor manufacturers did this?


Yeah, that would be great. I would wish that all driver manufacturers did this. I think that there is one big reason why this doesn't happen. Just think about all the poor souls with their 56K modem tongue.gif

QUOTE
The only negative I can find so far is that we will still be bound to the 4096 character limitation in the winnt.sif file.


This method solves this problem

@schalti

Would it be possible to let SetupCopyOEMInf.exe scan inside a .CAB or .7z file?

This post has been edited by erik_demon: Apr 23 2005, 05:47 AM
Go to the top of the page
 
+Quote Post
schalti
post Apr 23 2005, 01:32 PM
Post #35


Junior
*

Group: Members
Posts: 65
Joined: 22-July 04
Member No.: 25116
Country Flag


QUOTE (erik_demon @ Apr 23 2005, 05:30 AM)
@schalti
Would it be possible to let SetupCopyOEMInf.exe scan inside a .CAB or .7z file?
*


unsure.gif
You can make scan SetupCopyOEMInf.exe inside .CAB or .7z files (given that source code is available for opening .7z files AND (most important) Pyron is willing to do the job or to make SetupCopyOEMInf Open Source such as somebody else could do it) but I think you cannot make Windows pick the driver files from inside a CAB file without modifying the driver's INF-file and thereby breaking the signature of the driver. Matrox Video drivers use the method with CAB-files for example, most others don't. Is there a way to mount a CAB-file as a new local drive or subdirectory such as it will be transparent file system access for Windows?

I have a little problem though to understand the issue of space on a local harddrive. You unpack it from a CD/DVD (where space is limited) to the local drive where you have plenty of space and then scan it using SetupCopyOEMInf.exe.


There is another thing I'm working on for quite some time already. Since the release of Windows 2003 Server M$ will hand out the software to create signed drivers to OEMs to bring some relief to WHQL. Since I work at a company that is also a M$ partner with plenty of M$ 'Gold Status' certificates I want to test how much those certificates are really worth for a techie, not only for sales newwink.gif . If we would have a software to sign drivers we could rebuild all of them into .CAB-based drivers with a correct signature no problem. This would save space on both CD/DVD and local harddrive.

blushing.gif
Go to the top of the page
 
+Quote Post
Bilou_Gateux
post Apr 23 2005, 02:28 PM
Post #36


Powered by Windows Embedded
*****

Group: Members
Posts: 752
Joined: 3-January 04
From: Underworld
Member No.: 11874
OS: XP Pro x86
Country Flag


About the size of the drivers binaries, i recommend to use Driver Compressor Tool by hp38guser. It really saves a lot of space and as inf and cat files are both left uncompressed, you can use schalti method and Pyron tool to scan PnP drivers folders.
Go to the top of the page
 
+Quote Post
Bâshrat the Snea...
post Apr 23 2005, 02:44 PM
Post #37


aka Wim Leers
Group Icon

Group: Patrons
Posts: 2214
Joined: 29-October 03
From: Hasselt, Belgium
Member No.: 8748
OS: none
Country Flag


@Bilou Gateau: separate files compressing gives a worse result than compressing all files into one big file...

And you're a fairly advanced member, maybe you know how the built-in Windows ability of reading CAB files is organized? I'd like to add the same thing for 7-zip! (would give us MUCH better compression)
Go to the top of the page
 
+Quote Post
schalti
post Apr 23 2005, 05:42 PM
Post #38


Junior
*

Group: Members
Posts: 65
Joined: 22-July 04
Member No.: 25116
Country Flag


QUOTE (Bâshrat the Sneaky @ Apr 23 2005, 02:44 PM)
@Bilou Gateau: separate files compressing gives a worse result than compressing all files into one big file...

And you're a fairly advanced member, maybe you know how the built-in Windows ability of reading CAB files is organized? I'd like to add the same thing for 7-zip! (would give us MUCH better compression)
*


CLSID for .CAB files in W2k: {0CD7A5C0-9F37-11CE-AE65-08002B2E1262}
CLSID for .ZIP files in WXP/w2k3: {E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}

Extending the Windows Explorer with Name Space Extensions

With this method and since 7-Zip is Open Source it should be possible to integrate a 7zipview.dll/7zip.dll instead of cabview.dll/cabinet.dll and zipfldr.dll/dzip.dll/dzip32.dll/dunzip.dll/dunzip32.dll ( Enable compressed folder in w2k )

Very good idea thumbup.gif

Maybe one of the developers of 7-zip will write the necessary DLLs?
-> Let's put a feature request on Sourceforge Project 7-Zip

blushing.gif
Go to the top of the page
 
+Quote Post
erik_demon
post Apr 24 2005, 07:22 AM
Post #39


Master Chief
**

Group: Members
Posts: 253
Joined: 22-August 04
From: Lelystad
Member No.: 28465
OS: XP Pro x86
Country Flag


Hi welcome.gif

I did another test today and this time my presetup.cmd looks like this (Bashrat's DP method 2 with preserving the drivers) :

CODE
SET tagfile=\OEM
FOR %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist "%%i:%tagfile%" set CDDRIVE=%%i:

CD /D %SystemRoot%\system32

CD /D %SystemDrive%
%CDDRIVE%\OEM\bin\7za.exe x -y -aoa %CDDRIVE%\OEM\DriverPack_*.7z -o"%SystemRoot%\BtS_DriverPacks\"

START /WAIT %CDDRIVE%\OEM\bin\SetupCopyOEMInf.exe %SystemRoot%\BtS_DriverPacks\D

START %CDDRIVE%\OEM\bin\WatchDriverSigningPolicy.exe


Because of the START /WAIT command, SetupCopyOEMInf.exe is finally loaded during presetup smile.gif

There however still is a problem

When SetupCopyOEMInf.exe start it fails to intergrade the driver sad.gif :

CODE
Found C:\Windows\BtS_DriverPacks\D\W\L\blabla.inf Trying to intergrade ... failed


I get this with 95% of the drivers.

When I run SetupCopyOEMInf.exe in windows again it works flawless blink.gif

What could be the problem?
Go to the top of the page
 
+Quote Post
RogueSpear
post Apr 24 2005, 07:43 AM
Post #40


OS: SimplyMEPIS
Group Icon

Group: Normal Sponsors
Posts: 1529
Joined: 18-September 04
From: Buffalo, NY
Member No.: 31429
OS: none
Country Flag


The problem is that Windows setup hasn't run AT ALL at this point yet, so there is no directory structure to be found on the hard drive. Try running SetupCopyOEMInf.exe from DetachedProgram and I bet it works for you.

EDIT: You may want to make a simple batch that you call from DetachedProgram to run SetupCopyOEMInf.exe otherwise you'll have to play around with the Arguments entry in the WINNT.SIF.
Go to the top of the page
 
+Quote Post

Google Frontpage Forums Unattended CD/DVD Guide

5 Pages V  < 1 2 3 4 > » 
Closed TopicStart new topic
2 User(s) are reading this topic (2 Guests and 0 Anonymous Users)
0 Members:

 




Lo-Fi Version Time is now: 22nd November 2009 - 01:40 PM
All trademarks mentioned on this page are the property of their respective owners
MSFN is not affiliated with Microsoft
Copyright © 2001-2009 msfn.org
Privacy Policy