/ Hex Artifact Content
Login

Artifact 904f85152f806084826f5e6d7aae05d3cf4dc5d1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d  mmon.h"../*.** M
02a0: 61 63 72 6f 20 74 6f 20 66 69 6e 64 20 74 68 65  acro to find the
02b0: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 74 77 6f 20   minimum of two 
02c0: 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 2e 0a  numeric values..
02d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 49 4e 0a 23  */.#ifndef MIN.#
02e0: 20 64 65 66 69 6e 65 20 4d 49 4e 28 78 2c 79 29   define MIN(x,y)
02f0: 20 28 28 78 29 3c 28 79 29 3f 28 78 29 3a 28 79   ((x)<(y)?(x):(y
0300: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
0310: 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
0320: 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
0330: 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
0340: 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
0350: 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
0360: 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ES.# define INVA
0370: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
0380: 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29 20  TES ((DWORD)-1) 
0390: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
03a0: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
03b0: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
03c0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
03d0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
03e0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
03f0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
0400: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
0410: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
0420: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
0430: 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61  #endif../* Forwa
0440: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  rd references */
0450: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0460: 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20  winShm winShm;  
0470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
0480: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
0490: 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed-memory */.typ
04a0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
04b0: 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64  hmNode winShmNod
04c0: 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e  e;   /* A region
04d0: 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
04e0: 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 43  y */../*.** WinC
04f0: 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20 73  E lacks native s
0500: 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65 20  upport for file 
0510: 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68 61  locking so we ha
0520: 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a 2a  ve to fake it.**
0530: 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65 20   with some code 
0540: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a 23  of our own..*/.#
0550: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
0560: 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  CE.typedef struc
0570: 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20 20  t winceLock {.  
0580: 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20 20  int nReaders;   
0590: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
05a0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f 62   reader locks ob
05b0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
05c0: 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20 20   bPending;      
05d0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 70  /* Indicates a p
05e0: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
05f0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0600: 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76 65  .  BOOL bReserve
0610: 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  d;     /* Indica
0620: 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  tes a reserved l
0630: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0640: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0650: 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20 2f  bExclusive;    /
0660: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20 65  * Indicates an e
0670: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68 61  xclusive lock ha
0680: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0690: 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b 0a  */.} winceLock;.
06a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
06b0: 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63 74  e winFile struct
06c0: 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61 73  ure is a subclas
06d0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
06e0: 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  e* specific to t
06f0: 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72 74  he win32.** port
0700: 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a 2a  ability layer..*
0710: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0720: 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c 65   winFile winFile
0730: 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  ;.struct winFile
0740: 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74   {.  const sqlit
0750: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
0760: 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75 73  Method; /*** Mus
0770: 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f 0a  t be first ***/.
0780: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
0790: 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Vfs;      /* The
07a0: 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70 65   VFS used to ope
07b0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
07c0: 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
07d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
07e0: 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67  le for accessing
07f0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75   the file */.  u
0800: 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  8 locktype;     
0810: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
0820: 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79  f lock currently
0830: 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69   held on this fi
0840: 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68  le */.  short sh
0850: 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20  aredLockByte;   
0860: 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73  /* Randomly chos
0870: 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20  en byte used as 
0880: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  a shared lock */
0890: 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73 3b  .  u8 ctrlFlags;
08a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
08b0: 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49 4c  ags.  See WINFIL
08c0: 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 44  E_* below */.  D
08d0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
08e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
08f0: 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
0900: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
0910: 72 6f 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ror */.  winShm 
0920: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
0930: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
0940: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
0950: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
0960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
0970: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
0980: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
0990: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
09a0: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
09b0: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
09c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
09d0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
09e0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
09f0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
0a00: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
0a10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
0a20: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
0a30: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
0a40: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
0a50: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
0a60: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
0a70: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
0a80: 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c  ock */  .  HANDL
0a90: 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20  E hShared;      
0aa0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
0ab0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64  ory segment used
0ac0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a   for locking */.
0ad0: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61    winceLock loca
0ae0: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63  l;        /* Loc
0af0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74  ks obtained by t
0b00: 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  his instance of 
0b10: 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  winFile */.  win
0b20: 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20  ceLock *shared; 
0b30: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
0b40: 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72  hared lock memor
0b50: 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20  y for the file  
0b60: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
0b70: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0b80: 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63  es for winFile.c
0b90: 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  trlFlags.*/.#def
0ba0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
0bb0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
0bc0: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
0bd0: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
0be0: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
0bf0: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
0c00: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
0c10: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
0c20: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
0c30: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
0c40: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
0c50: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
0c60: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
0c70: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0c80: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
0c90: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
0ca0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
0cb0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
0cc0: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
0cd0: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
0ce0: 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
0cf0: 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33  with SQLITE_WIN3
0d00: 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64  2_MALLOC on Wind
0d10: 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65  ows, we will use
0d20: 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20   the. * various 
0d30: 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66  Win32 API heap f
0d40: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64  unctions instead
0d50: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f   of our own.. */
0d60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
0d70: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a  IN32_MALLOC../*.
0d80: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
0d90: 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61  n-zero, an isola
0da0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
0db0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
0dc0: 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20  native Win32. * 
0dd0: 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73  allocator subsys
0de0: 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tem; otherwise, 
0df0: 74 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63  the default proc
0e00: 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ess heap will be
0e10: 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20   used.  This. * 
0e20: 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65  setting has no e
0e30: 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69  ffect when compi
0e40: 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20  ling for WinRT. 
0e50: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
0e60: 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20  s is enabled. * 
0e70: 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20  and an isolated 
0e80: 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65  heap will be cre
0e90: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c  ated to store al
0ea0: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61  l allocated data
0eb0: 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *. **********
0ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f00: 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a  ****. * WARNING:
0f10: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
0f20: 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68   to note that wh
0f30: 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20  en this setting 
0f40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
0f50: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20  the. *          
0f60: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66  winMemShutdown f
0f70: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
0f80: 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73  d (e.g. by the s
0f90: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
0fa0: 20 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63   *          func
0fb0: 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20  tion), all data 
0fc0: 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74  that was allocat
0fd0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f  ed using the iso
0fe0: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a  lated heap will.
0ff0: 20 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66   *          be f
1000: 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  reed immediately
1010: 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74   and any attempt
1020: 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f   to access any o
1030: 66 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20  f that freed. * 
1040: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69           data wi
1050: 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ll almost certai
1060: 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  nly result in an
1070: 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73   immediate acces
1080: 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a  s violation.. **
1090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f  ************. */
10e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10f0: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
1100: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1110: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
1120: 45 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23  EATE    (TRUE).#
1130: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1140: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
1150: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1160: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
1170: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
1180: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
1190: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
11a0: 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65  _INIT_SIZE.#  de
11b0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
11c0: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
11d0: 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   ((SQLITE_DEFAUL
11e0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20  T_CACHE_SIZE) * 
11f0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
1220: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1230: 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23  ZE) + 4194304).#
1240: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1250: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
1260: 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69   the Win32-speci
1270: 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20  fic heap.  This 
1280: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
1290: 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  o.. */.#ifndef S
12a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
12b0: 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66  _MAX_SIZE.#  def
12c0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
12d0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20  _HEAP_MAX_SIZE  
12e0: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  (0).#endif../*. 
12f0: 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67  * The extra flag
1300: 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c  s to use in call
1310: 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68  s to the Win32 h
1320: 65 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20  eap APIs.  This 
1330: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20  value may be. * 
1340: 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66  zero for the def
1350: 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20  ault behavior.. 
1360: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1370: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
1380: 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  GS.#  define SQL
1390: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
13a0: 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e  LAGS     (0).#en
13b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  dif../*.** The w
13c0: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
13d0: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
13e0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
13f0: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
1400: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
1410: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
1420: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
1430: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1440: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
1450: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
1460: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
1470: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
1480: 61 67 69 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69  agic;    /* Magi
1490: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
14a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
14b0: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
14c0: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
14d0: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
14e0: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
14f0: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
1500: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
1510: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
1520: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
1530: 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  own)? */.};..#if
1540: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
1550: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
1560: 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a       0x42b2830b.
1570: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73  #endif..static s
1580: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
1590: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20   win_mem_data = 
15a0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
15b0: 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c  .  WINMEM_MAGIC,
15c0: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
15d0: 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65  FALSE.};..#ifnde
15e0: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
15f0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
1600: 69 63 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  ic() assert( win
1610: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d  _mem_data.magic=
1620: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a  =WINMEM_MAGIC ).
1630: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69  #else.#define wi
1640: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
1650: 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ).#endif..#defin
1660: 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  e winMemGetHeap(
1670: 29 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68  ) win_mem_data.h
1680: 48 65 61 70 0a 0a 73 74 61 74 69 63 20 76 6f 69  Heap..static voi
1690: 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28  d *winMemMalloc(
16a0: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
16b0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
16c0: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
16d0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  );.static void *
16e0: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f  winMemRealloc(vo
16f0: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
1700: 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20  nBytes);.static 
1710: 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76  int winMemSize(v
1720: 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20  oid *p);.static 
1730: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
1740: 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63  p(int n);.static
1750: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
1760: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
1770: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1780: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
1790: 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f   *pAppData);..co
17a0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
17b0: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
17c0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
17d0: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
17e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
17f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1800: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
1810: 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20  e is (normally) 
1820: 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76  set once and nev
1830: 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  er changes.** th
1840: 65 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65  ereafter.  It re
1850: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68  cords whether th
1860: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
1870: 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f  em is Win9x.** o
1880: 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30  r WinNT..**.** 0
1890: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
18a0: 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a  stem unknown..**
18b0: 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   1:   Operating 
18c0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e  system is Win9x.
18d0: 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69  .** 2:   Operati
18e0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
18f0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64  NT..**.** In ord
1900: 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  er to facilitate
1910: 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69   testing on a Wi
1920: 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20  nNT system, the 
1930: 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20  test fixture.** 
1940: 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74  can manually set
1950: 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31   this value to 1
1960: 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39   to emulate Win9
1970: 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23  8 behavior..*/.#
1980: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1990: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  T.int sqlite3_os
19a0: 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65  _type = 0;.#else
19b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
19c0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
19d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
19e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
19f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
1a00: 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  T.#  define SQLI
1a10: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1a20: 49 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  I.#endif..#if SQ
1a30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
1a40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54   SQLITE_OS_WINNT
1a50: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
1a60: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NRT.#  define SQ
1a70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1a80: 49 44 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  IDE.#endif..#ifn
1a90: 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64  def SYSCALL.#  d
1aa0: 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71  efine SYSCALL sq
1ab0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
1ac0: 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  r.#endif../*.** 
1ad0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ae0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
1af0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20  n Windows CE or 
1b00: 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20  WinRT.. */..#if 
1b10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1b20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
1b30: 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41  RT.#  define osA
1b40: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
1b50: 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a         1.#endif.
1b60: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
1b70: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
1b80: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
1b90: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
1ba0: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
1bb0: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
1bc0: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
1bd0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
1be0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
1bf0: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
1c00: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
1c10: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
1c20: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
1c30: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
1c40: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
1c50: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
1c60: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
1c70: 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63   struct win_sysc
1c80: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
1c90: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
1ca0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1cb0: 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c 20   the sytem call 
1cc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
1cd0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
1ce0: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
1cf0: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
1d00: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
1d10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
1d20: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
1d30: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
1d40: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23  aSyscall[] = {.#
1d50: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1d60: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
1d70: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65  S_WINRT.  { "Are
1d80: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
1d90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
1da0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c  AreFileApisANSI,
1db0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
1dc0: 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65  lse.  { "AreFile
1dd0: 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20  ApisANSI",      
1de0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
1e10: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46  ..#ifndef osAreF
1e20: 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66  ileApisANSI.#def
1e30: 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69  ine osAreFileApi
1e40: 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e  sANSI ((BOOL(WIN
1e50: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
1e60: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
1e70: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
1e80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
1e90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ea0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1eb0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
1ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
1ed0: 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65  SYSCALL)CharLowe
1ee0: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
1ef0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
1f00: 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20  "CharLowerW",   
1f10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
1f20: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
1f40: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
1f50: 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28  e osCharLowerW (
1f60: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
1f70: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
1f80: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
1f90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1fa0: 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53  NCE && defined(S
1fb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1fc0: 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55  WIDE).  { "CharU
1fd0: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
1fe0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68       (SYSCALL)Ch
1ff0: 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20  arUpperW,       
2000: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2010: 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72  e.  { "CharUpper
2020: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2030: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2060: 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70  #define osCharUp
2070: 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49  perW ((LPWSTR(WI
2080: 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61  NAPI*)(LPWSTR))a
2090: 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72  Syscall[2].pCurr
20a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65  ent)..  { "Close
20b0: 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20  Handle",        
20c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c       (SYSCALL)Cl
20d0: 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20  oseHandle,      
20e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
20f0: 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64  fine osCloseHand
2100: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
2110: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
2120: 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29  all[3].pCurrent)
2130: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2140: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2150: 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65  NSI).  { "Create
2160: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
2170: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2180: 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20  ateFileA,       
2190: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
21a0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
21b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
21c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
21f0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
2200: 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49  ileA ((HANDLE(WI
2210: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
2220: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
2230: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
2240: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
2250: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
2260: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
2270: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
2280: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
2290: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
22a0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
22b0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
22d0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57  CALL)CreateFileW
22e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
22f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
2300: 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  eateFileW",     
2310: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2320: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2330: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2340: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2350: 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48  sCreateFileW ((H
2360: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
2370: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
2380: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
2390: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
23a0: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
23b0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
23c0: 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [5].pCurrent)..#
23d0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
23e0: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
23f0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
2400: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2410: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
2420: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
2430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
2440: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
2450: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
2460: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
2470: 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20 20  FileMappingW,   
2480: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2490: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
24a0: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
24b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
24d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
24e0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
24f0: 4d 61 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c  MappingW ((HANDL
2500: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
2510: 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  E,LPSECURITY_ATT
2520: 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20  RIBUTES, \.     
2530: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44     DWORD,DWORD,D
2540: 57 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53  WORD,LPCWSTR))aS
2550: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
2560: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
2570: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
2580: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2590: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
25a0: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
25b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
25c0: 41 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57  ALL)CreateMutexW
25d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
25e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
25f0: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
2600: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2610: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2620: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2630: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2640: 43 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48  CreateMutexW ((H
2650: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
2660: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
2670: 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20  UTES,BOOL, \.   
2680: 20 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53       LPCWSTR))aS
2690: 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65  yscall[7].pCurre
26a0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
26b0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
26c0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c  S_ANSI).  { "Del
26d0: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
26e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
26f0: 44 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20  DeleteFileA,    
2700: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2710: 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  lse.  { "DeleteF
2720: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
2730: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2760: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65  ..#define osDele
2770: 74 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57  teFileA ((BOOL(W
2780: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
2790: 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72  aSyscall[8].pCur
27a0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
27b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
27c0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44  HAS_WIDE).  { "D
27d0: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
27e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
27f0: 4c 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20  L)DeleteFileW,  
2800: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2810: 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74  #else.  { "Delet
2820: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
2830: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2860: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65  if..#define osDe
2870: 6c 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c  leteFileW ((BOOL
2880: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
2890: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
28a0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
28b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
28c0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
28d0: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
28e0: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
28f0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
2900: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
2910: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
2920: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
2930: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2950: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2960: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
2970: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
2980: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
2990: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
29a0: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
29b0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
29c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
29d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
29e0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
29f0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
2a00: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
2a10: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
2a20: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
2a30: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
2a40: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
2a50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
2a60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2a70: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
2a80: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
2a90: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
2aa0: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
2ab0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
2ac0: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
2ad0: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
2ae0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
2af0: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
2b00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
2b10: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
2b20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2b30: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
2b40: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
2b50: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
2b60: 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43  )aSyscall[12].pC
2b70: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
2b80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2b90: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
2ba0: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
2bb0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
2bc0: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
2bd0: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
2be0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
2bf0: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
2c00: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2c10: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2c20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2c30: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
2c40: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
2c50: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
2c60: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
2c70: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
2c80: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
2c90: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
2ca0: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
2cb0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2cc0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2cd0: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
2ce0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
2cf0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
2d00: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
2d10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2d20: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
2d30: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
2d40: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2d70: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
2d80: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
2d90: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
2da0: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
2db0: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
2dc0: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
2dd0: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
2de0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  4].pCurrent)..  
2df0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2e10: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
2e20: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
2e30: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
2e40: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
2e50: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
2e60: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d  LE))aSyscall[15]
2e70: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
2e80: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
2e90: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
2ea0: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
2eb0: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
2ec0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
2ed0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2ee0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
2ef0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
2f00: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
2f10: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2f20: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2f30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2f40: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
2f50: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
2f60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
2f70: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
2f80: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
2f90: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
2fa0: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
2fb0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2fe0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
2ff0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
3000: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3010: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
3020: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
3030: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
3040: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3050: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3060: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3070: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3080: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3090: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
30a0: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
30b0: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
30c0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
30d0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
30e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
30f0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
3100: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
3110: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3140: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
3150: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
3160: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
3170: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
3180: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
3190: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
31a0: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
31b0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
31c0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
31d0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
31e0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
31f0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3200: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3210: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
3220: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
3230: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
3240: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3260: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3270: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3280: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
3290: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
32a0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
32b0: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
32c0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
32d0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
32e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
32f0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
3300: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
3310: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3320: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3330: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
3340: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
3350: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
3360: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3390: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
33a0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
33b0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
33c0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
33d0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
33e0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
33f0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3400: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
3410: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
3420: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
3430: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
3440: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3450: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3460: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
3470: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
34a0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
34b0: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
34c0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
34d0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
34e0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
34f0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
3500: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
3510: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
3520: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
3530: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
3540: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3550: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3570: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
3580: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
3590: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
35a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
35c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
35d0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
35e0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
35f0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
3600: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
3610: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
3620: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
3630: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3640: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3650: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
3660: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3670: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
3680: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
3690: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
36a0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
36b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
36c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
36e0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
36f0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
3700: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3710: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
3720: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
3730: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
3740: 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  23].pCurrent)..#
3750: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3760: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
3770: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3780: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3790: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
37a0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
37b0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
37c0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
37d0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
37e0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
37f0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
3800: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3830: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3840: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
3850: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3860: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
3870: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
3880: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
3890: 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[24].pCurrent).
38a0: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
38b0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
38c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
38d0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
38e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
38f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
3900: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3910: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
3920: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
3930: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3940: 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
3950: 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
3960: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
3970: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
3980: 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65  s CE. */.  { "Ge
3990: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
39a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
39b0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
39c0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
39d0: 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
39e0: 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  her Windows plat
39f0: 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
3a00: 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
3a10: 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e   take.  ** an AN
3a20: 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  SI string regard
3a30: 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
3a40: 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
3a50: 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72    { "GetProcAddr
3a60: 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28  essA",         (
3a70: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41  SYSCALL)GetProcA
3a80: 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20  ddress,         
3a90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3aa0: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41  efine osGetProcA
3ab0: 64 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f  ddressA ((FARPRO
3ac0: 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  C(WINAPI*)(HMODU
3ad0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
3ae0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  CSTR))aSyscall[2
3af0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
3b00: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3b10: 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  RT.  { "GetSyste
3b20: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
3b30: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79    (SYSCALL)GetSy
3b40: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20  stemInfo,       
3b50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3b60: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
3b70: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
3b80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3bb0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
3bc0: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
3bd0: 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e  PI*)(LPSYSTEM_IN
3be0: 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d  FO))aSyscall[27]
3bf0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3c00: 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c  "GetSystemTime",
3c10: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3c20: 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d  ALL)GetSystemTim
3c30: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
3c40: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
3c50: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49  SystemTime ((VOI
3c60: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53  D(WINAPI*)(LPSYS
3c70: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
3c80: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
3c90: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3ca0: 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79  WINCE.  { "GetSy
3cb0: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
3cc0: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  me", (SYSCALL)Ge
3cd0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
3ce0: 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73  eTime, 0 },.#els
3cf0: 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  e.  { "GetSystem
3d00: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
3d10: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3d40: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
3d50: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
3d60: 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  e ((VOID(WINAPI*
3d70: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  )( \.        LPF
3d80: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
3d90: 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[29].pCurrent).
3da0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3db0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
3dc0: 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  SI).  { "GetTemp
3dd0: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
3de0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
3df0: 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20  empPathA,       
3e00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3e10: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
3e20: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
3e30: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3e60: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
3e70: 61 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e  athA ((DWORD(WIN
3e80: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54  API*)(DWORD,LPST
3e90: 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e  R))aSyscall[30].
3ea0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3eb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3ec0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3ed0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3ee0: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
3ef0: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
3f00: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
3f10: 70 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20  pPathW,         
3f20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3f30: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
3f40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3f50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
3f80: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
3f90: 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hW ((DWORD(WINAP
3fa0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52  I*)(DWORD,LPWSTR
3fb0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
3fc0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3fd0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
3fe0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
3ff0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4000: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
4010: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
4020: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4030: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
4040: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4050: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4060: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4070: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4080: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20   osGetTickCount 
4090: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
40a0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
40b0: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
40c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
40d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
40e0: 29 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  ).  { "GetVersio
40f0: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
4100: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72   (SYSCALL)GetVer
4110: 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20  sionExA,        
4120: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4130: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
4140: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4150: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4170: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4180: 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e  ine osGetVersion
4190: 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExA ((BOOL(WINAP
41a0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
41b0: 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29  POSVERSIONINFOA)
41c0: 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43  )aSyscall[33].pC
41d0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65  urrent)..  { "He
41e0: 61 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  apAlloc",       
41f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4200: 29 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20  )HeapAlloc,     
4210: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4220: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c  #define osHeapAl
4230: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
4240: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
4250: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  RD, \.        SI
4260: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33  ZE_T))aSyscall[3
4270: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
4280: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4290: 52 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  RT.  { "HeapCrea
42a0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
42b0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43    (SYSCALL)HeapC
42c0: 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  reate,          
42d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
42e0: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4300: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4330: 66 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74  fine osHeapCreat
4340: 65 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  e ((HANDLE(WINAP
4350: 49 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54  I*)(DWORD,SIZE_T
4360: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
4370: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d  _T))aSyscall[35]
4380: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4390: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
43a0: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
43b0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
43c0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73  (SYSCALL)HeapDes
43d0: 74 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20  troy,           
43e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
43f0: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
4400: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4410: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4430: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4440: 6e 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ne osHeapDestroy
4450: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4460: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
4470: 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[36].pCurrent).
4480: 0a 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c  .  { "HeapFree",
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65  (SYSCALL)HeapFre
44b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
44c0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
44d0: 6f 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f  osHeapFree ((BOO
44e0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
44f0: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29  E,DWORD,LPVOID))
4500: 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75  aSyscall[37].pCu
4510: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
4520: 70 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20  pReAlloc",      
4530: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4540: 48 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20  HeapReAlloc,    
4550: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4560: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41  define osHeapReA
4570: 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49  lloc ((LPVOID(WI
4580: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
4590: 4f 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20  ORD,LPVOID, \.  
45a0: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
45b0: 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72  yscall[38].pCurr
45c0: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53  ent)..  { "HeapS
45d0: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
45e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
45f0: 61 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  apSize,         
4600: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4610: 66 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20  fine osHeapSize 
4620: 28 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a  ((SIZE_T(WINAPI*
4630: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
4640: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49  \.        LPCVOI
4650: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e  D))aSyscall[39].
4660: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4670: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
4680: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
4690: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
46a0: 53 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69  SYSCALL)HeapVali
46b0: 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  date,           
46c0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
46d0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
46e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
46f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4710: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4720: 65 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  e osHeapValidate
4730: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4740: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
4750: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
4760: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
4770: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4790: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
47a0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
47c0: 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79  CALL)LoadLibrary
47d0: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  A,            0 
47e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
47f0: 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20  adLibraryA",    
4800: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4810: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4820: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4830: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4840: 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28  sLoadLibraryA ((
4850: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
4860: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
4870: 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[41].pCurrent).
4880: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4890: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
48a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
48b0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4c 6f 61  S_WIDE).  { "Loa
48c0: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
48d0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
48e0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
48f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4900: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
4910: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
4920: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4950: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
4960: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
4970: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
4980: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 32  STR))aSyscall[42
4990: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
49a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
49b0: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
49c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
49d0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
49e0: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
49f0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4a00: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4a20: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4a40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4a50: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
4a60: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
4a70: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
4a80: 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[43].pCurrent)
4a90: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4aa0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
4ab0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4ac0: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
4ad0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4ae0: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
4b10: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
4b20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4b50: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
4b60: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
4b70: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
4b80: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
4b90: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
4ba0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
4bb0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
4bc0: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  4].pCurrent).#en
4bd0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
4be0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
4bf0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
4c00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4c10: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
4c20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c30: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
4c40: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
4c50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4c80: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
4c90: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
4ca0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
4cb0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4cc0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
4cd0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
4ce0: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
4cf0: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
4d00: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
4d10: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
4d20: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
4d30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4d40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4d50: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
4d60: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
4d70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4d80: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
4d90: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
4da0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
4db0: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
4dc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4dd0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4de0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4df0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4e00: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  MapViewOfFile ((
4e10: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
4e20: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
4e30: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
4e40: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
4e50: 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e  call[46].pCurren
4e60: 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79  t)..  { "MultiBy
4e70: 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20  teToWideChar",  
4e80: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74     (SYSCALL)Mult
4e90: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c  iByteToWideChar,
4ea0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4eb0: 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f  ne osMultiByteTo
4ec0: 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57  WideChar ((int(W
4ed0: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
4ee0: 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50  RD,LPCSTR,int,LP
4ef0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
4f00: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  int))aSyscall[47
4f10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4f20: 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e   "QueryPerforman
4f30: 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53  ceCounter", (SYS
4f40: 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72  CALL)QueryPerfor
4f50: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20  manceCounter, 0 
4f60: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75  },..#define osQu
4f70: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
4f80: 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e  unter ((BOOL(WIN
4f90: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
4fa0: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29   LARGE_INTEGER*)
4fb0: 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43  )aSyscall[48].pC
4fc0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65  urrent)..  { "Re
4fd0: 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  adFile",        
4fe0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4ff0: 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20  )ReadFile,      
5000: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5010: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69  #define osReadFi
5020: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
5030: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44  *)(HANDLE,LPVOID
5040: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
5050: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
5060: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
5070: 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [49].pCurrent)..
5080: 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c    { "SetEndOfFil
5090: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
50a0: 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66  SYSCALL)SetEndOf
50b0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
50c0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
50d0: 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28  sSetEndOfFile ((
50e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
50f0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
5100: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
5110: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5120: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
5130: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
5140: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
5150: 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20  lePointer,      
5160: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5170: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
5180: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
5190: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
51c0: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
51d0: 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49  inter ((DWORD(WI
51e0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f  NAPI*)(HANDLE,LO
51f0: 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20  NG,PLONG, \.    
5200: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
5210: 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74  all[51].pCurrent
5220: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5230: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65  S_WINRT.  { "Sle
5240: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
5250: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5260: 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
5270: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5280: 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  lse.  { "Sleep",
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
52d0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65  ..#define osSlee
52e0: 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  p ((VOID(WINAPI*
52f0: 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  )(DWORD))aSyscal
5300: 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[52].pCurrent).
5310: 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65  .  { "SystemTime
5320: 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20  ToFileTime",    
5330: 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54  (SYSCALL)SystemT
5340: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20  imeToFileTime,  
5350: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5360: 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
5370: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
5380: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53  NAPI*)(CONST SYS
5390: 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  TEMTIME*, \.    
53a0: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
53b0: 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75  aSyscall[53].pCu
53c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
53d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
53e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
53f0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
5400: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5410: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
5420: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
5430: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5440: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5460: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5480: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
5490: 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a  ef osUnlockFile.
54a0: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
54b0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
54c0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
54d0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
54e0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
54f0: 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75  aSyscall[54].pCu
5500: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
5510: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5520: 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NCE.  { "UnlockF
5530: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
5540: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
5550: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
5560: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5570: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
5580: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
5590: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
55c0: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
55d0: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
55e0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
55f0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
5600: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
5610: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
5620: 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  55].pCurrent)..#
5630: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5640: 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  CE || !defined(S
5650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
5660: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
5670: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
5680: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
5690: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
56a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
56b0: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
56c0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
56d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
56f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5700: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
5710: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
5720: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
5730: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
5740: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
5750: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
5760: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
5770: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
5780: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
5790: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
57a0: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
57b0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
57c0: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
57d0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
57e0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
57f0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d  OL))aSyscall[57]
5800: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5810: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
5820: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5830: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5850: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
5860: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
5870: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
5880: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
5890: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
58a0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
58b0: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
58c0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
58d0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
58e0: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
58f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5900: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
5910: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5920: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
5930: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
5940: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5970: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
5980: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
5990: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
59a0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
59b0: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
59c0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
59d0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d  RD))aSyscall[59]
59e0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
59f0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5a00: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
5a10: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
5a20: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
5a30: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
5a40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5a50: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
5a60: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
5a70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5a90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5aa0: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
5ab0: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
5ac0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5ad0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5ae0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e  D))aSyscall[60].
5af0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
5b00: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5b10: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
5b20: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
5b30: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
5b40: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20  ngleObjectEx,   
5b50: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5b60: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
5b70: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
5b80: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5ba0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5bb0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
5bc0: 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44  ObjectEx ((DWORD
5bd0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5be0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
5bf0: 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c    BOOL))aSyscall
5c00: 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [61].pCurrent)..
5c10: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
5c20: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
5c30: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
5c40: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
5c50: 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20  ilePointerEx,   
5c60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5c70: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
5c80: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
5c90: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5cc0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
5cd0: 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28  ointerEx ((BOOL(
5ce0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5cf0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c  LARGE_INTEGER, \
5d00: 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f  .        PLARGE_
5d10: 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61  INTEGER,DWORD))a
5d20: 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72  Syscall[62].pCur
5d30: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
5d40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5d50: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
5d60: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
5d70: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49  SYSCALL)GetFileI
5d80: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
5d90: 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  leEx, 0 },.#else
5da0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
5db0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
5dc0: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  Ex", (SYSCALL)0,
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5df0: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
5e00: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
5e10: 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  dleEx ((BOOL(WIN
5e20: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
5e30: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46          FILE_INF
5e40: 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53  O_BY_HANDLE_CLAS
5e50: 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29  S,LPVOID,DWORD))
5e60: 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75  aSyscall[63].pCu
5e70: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
5e80: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
5e90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5ea0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61  MIT_WAL).  { "Ma
5eb0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
5ec0: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
5ed0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  )MapViewOfFileFr
5ee0: 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23  omApp,    0 },.#
5ef0: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
5f00: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
5f10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5f40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
5f50: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
5f60: 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  p ((LPVOID(WINAP
5f70: 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47  I*)(HANDLE,ULONG
5f80: 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20  ,ULONG64, \.    
5f90: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
5fa0: 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e  call[64].pCurren
5fb0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
5fc0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
5fd0: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
5fe0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5ff0: 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20  CreateFile2,    
6000: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6010: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
6020: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
6030: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6060: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
6070: 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45  teFile2 ((HANDLE
6080: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
6090: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  R,DWORD,DWORD,DW
60a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
60b0: 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  PCREATEFILE2_EXT
60c0: 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
60d0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70  ))aSyscall[65].p
60e0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
60f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6100: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
6110: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
6120: 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67  SCALL)LoadPackag
6130: 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30  edLibrary,     0
6140: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6150: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
6160: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
6170: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6180: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6190: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
61a0: 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
61b0: 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28  brary ((HMODULE(
61c0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
61d0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
61e0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e  D))aSyscall[66].
61f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6200: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6210: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
6220: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
6230: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
6240: 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20 20  unt64,          
6250: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6260: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
6270: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6280: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6290: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
62a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
62b0: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
62c0: 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49  4 ((ULONGLONG(WI
62d0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
62e0: 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65  scall[67].pCurre
62f0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6300: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
6310: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
6320: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
6330: 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  )GetNativeSystem
6340: 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23  Info,     0 },.#
6350: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74  else.  { "GetNat
6360: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
6370: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
63a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
63b0: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
63c0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
63d0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  ( \.        LPSY
63e0: 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63  STEM_INFO))aSysc
63f0: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
6400: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6410: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6420: 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75  ANSI).  { "Outpu
6430: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
6440: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
6450: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
6460: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
6470: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
6480: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
6490: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
64c0: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
64d0: 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28 56  DebugStringA ((V
64e0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
64f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 39  STR))aSyscall[69
6500: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6510: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6520: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
6530: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
6540: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
6550: 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65  SYSCALL)OutputDe
6560: 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20  bugStringW,     
6570: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6580: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
6590: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
65a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
65c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
65d0: 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53  e osOutputDebugS
65e0: 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49  tringW ((VOID(WI
65f0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
6600: 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75  aSyscall[70].pCu
6610: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
6620: 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20  ProcessHeap",   
6630: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6640: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20  GetProcessHeap, 
6650: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6660: 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63  define osGetProc
6670: 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45  essHeap ((HANDLE
6680: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
6690: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
66a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
66b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
66c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
66d0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72  MIT_WAL).  { "Cr
66e0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
66f0: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
6700: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
6710: 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c  ingFromApp, 0 },
6720: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
6730: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
6740: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
6750: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6760: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6770: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
6780: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
6790: 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45  FromApp ((HANDLE
67a0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
67b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
67c0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
67d0: 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c  S,ULONG,ULONG64,
67e0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
67f0: 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[72].pCurrent).
6800: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
6810: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
6820: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
6830: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
6840: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
6850: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
6860: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
6870: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33   of the.** "win3
6880: 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  2" VFSes.  Retur
6890: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
68a0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
68b0: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
68c0: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
68d0: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
68e0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
68f0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
6900: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
6910: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
6920: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
6930: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
6940: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
6950: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
6960: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
6970: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
6980: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6990: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
69a0: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
69b0: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
69c0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
69d0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
69e0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
69f0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
6a00: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
6a10: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
6a20: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6a30: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
6a40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6a50: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
6a60: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
6a70: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
6a80: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
6a90: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
6aa0: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
6ab0: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
6ac0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
6ad0: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
6ae0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6af0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
6b00: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
6b10: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
6b20: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
6b30: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
6b40: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
6b50: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
6b60: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
6b70: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
6b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
6ba0: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
6bb0: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
6bc0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
6bd0: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
6be0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
6bf0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
6c00: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
6c10: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
6c20: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
6c30: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6c40: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
6c50: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
6c60: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
6c70: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
6c80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6c90: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
6ca0: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
6cb0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
6cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6cd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6ce0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
6cf0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
6d00: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
6d10: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
6d20: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
6d30: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
6d40: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
6d50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6d60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6d80: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
6d90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
6da0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
6db0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
6dc0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
6dd0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
6de0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
6df0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
6e00: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
6e10: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
6e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
6e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
6e40: 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
6e50: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6e60: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
6e70: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
6e80: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
6e90: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
6ea0: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6eb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6ec0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6ed0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6ee0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6ef0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
6f00: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
6f10: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
6f20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6f30: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
6f40: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6f50: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
6f60: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
6f70: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
6f80: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
6f90: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
6fa0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6fb0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6fc0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
6fd0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
6fe0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
6ff0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
7000: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
7010: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
7020: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
7030: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7040: 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73  char *winNextSys
7050: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
7060: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
7070: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
7080: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
7090: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
70a0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
70b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
70c0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
70d0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
70e0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
70f0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7100: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
7110: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7120: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
7130: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
7140: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
7150: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7160: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
7170: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
7180: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
71a0: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
71b0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
71c0: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
71d0: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
71e0: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
71f0: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
7200: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
7210: 74 65 5f 64 65 62 75 67 28 63 68 61 72 20 2a 7a  te_debug(char *z
7220: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
7230: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
7240: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7250: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
7260: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
7270: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
7280: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
7290: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
72a0: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
72b0: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
72c0: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
72d0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
72e0: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
72f0: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
7300: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
7310: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
7320: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
7330: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7340: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
7350: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
7360: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
7370: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
7380: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
7390: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
73a0: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
73b0: 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75  in);.    osOutpu
73c0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44  tDebugStringA(zD
73d0: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
73e0: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
73f0: 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b  ugStringA(zBuf);
7400: 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e  .  }.#elif defin
7410: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
7420: 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73  HAS_WIDE).  mems
7430: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
7440: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7450: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20  BUF_SIZE);.  if 
7460: 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  ( osMultiByteToW
7470: 69 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20  ideChar(.       
7480: 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73     osAreFileApis
7490: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
74a0: 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a  : CP_OEMCP, 0, z
74b0: 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  Buf,.          n
74c0: 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62  Min, (LPWSTR)zDb
74d0: 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e  gBuf, SQLITE_WIN
74e0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f  32_DBG_BUF_SIZE/
74f0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d  sizeof(WCHAR))<=
7500: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
7510: 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44  .  }.  osOutputD
7520: 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43  ebugStringW((LPC
7530: 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23  WSTR)zDbgBuf);.#
7540: 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  else.  if( nMin>
7550: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
7560: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
7570: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
7580: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
7590: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
75a0: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72  , nMin);.    fpr
75b0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
75c0: 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  ", zDbgBuf);.  }
75d0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
75e0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
75f0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  zBuf);.  }.#endi
7600: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
7610: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
7620: 20 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75   suspends the cu
7630: 72 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72  rrent thread for
7640: 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20   at least ms.** 
7650: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54  milliseconds.  T
7660: 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
7670: 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53  t to the Win32 S
7680: 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65  leep() interface
7690: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
76a0: 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20  OS_WINRT.static 
76b0: 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20  HANDLE sleepObj 
76c0: 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
76d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
76e0: 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d  32_sleep(DWORD m
76f0: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69  illiseconds){.#i
7700: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7710: 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62  T.  if ( sleepOb
7720: 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  j==NULL ){.    s
7730: 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61  leepObj = osCrea
7740: 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c  teEventExW(NULL,
7750: 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56   NULL, CREATE_EV
7760: 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54  ENT_MANUAL_RESET
7770: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a    SYNCHRONIZE);.
77a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c    }.  assert( sl
77b0: 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a  eepObj!=NULL );.
77c0: 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c    osWaitForSingl
77d0: 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f  eObjectEx(sleepO
77e0: 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  bj, milliseconds
77f0: 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a  , FALSE);.#else.
7800: 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73    osSleep(millis
7810: 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a  econds);.#endif.
7820: 7d 0a 0a 44 57 4f 52 44 20 73 71 6c 69 74 65 33  }..DWORD sqlite3
7830: 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44 4c 45  Win32Wait(HANDLE
7840: 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57 4f   hObject){.  DWO
7850: 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20  RD rc;.  while( 
7860: 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  (rc = osWaitForS
7870: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 68 4f  ingleObjectEx(hO
7880: 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54 45 2c  bject, INFINITE,
7890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 20 20 20 20 20 20 20 54 52 55 45 29 29 3d 3d          TRUE))==
78c0: 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49  WAIT_IO_COMPLETI
78d0: 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ON ){}.  return 
78e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
78f0: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
7900: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
7910: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
7920: 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c  T, Win2K, WinXP,
7930: 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52  .** or WinCE.  R
7940: 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72  eturn false (zer
7950: 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69  o) for Win95, Wi
7960: 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a  n98, or WinME..*
7970: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20  *.** Here is an 
7980: 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65  interesting obse
7990: 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c  rvation:  Win95,
79a0: 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d   Win98, and WinM
79b0: 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f  E lack.** the Lo
79c0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20  ckFileEx() API. 
79d0: 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c   But we can stil
79e0: 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  l statically lin
79f0: 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a  k against that.*
7a00: 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73  * API as long as
7a10: 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69   we don't call i
7a20: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57  t when running W
7a30: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63  in95/98/ME.  A c
7a40: 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  all to.** this r
7a50: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
7a60: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
7a70: 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35  he host is Win95
7a80: 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e  /98/ME or.** Win
7a90: 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74  NT/2K/XP so that
7aa0: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
7ab0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20  ether or not we 
7ac0: 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a  can safely call.
7ad0: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
7ae0: 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  x() API..*/.#if 
7af0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7b00: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
7b10: 52 54 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54  RT.# define isNT
7b20: 28 29 20 20 28 31 29 0a 23 65 6c 73 65 0a 20 20  ()  (1).#else.  
7b30: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28  static int isNT(
7b40: 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73  void){.    if( s
7b50: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d  qlite3_os_type==
7b60: 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52  0 ){.      OSVER
7b70: 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b  SIONINFOA sInfo;
7b80: 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f  .      sInfo.dwO
7b90: 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65  SVersionInfoSize
7ba0: 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29   = sizeof(sInfo)
7bb0: 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72  ;.      osGetVer
7bc0: 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b  sionExA(&sInfo);
7bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  .      sqlite3_o
7be0: 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64  s_type = sInfo.d
7bf0: 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52  wPlatformId==VER
7c00: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
7c10: 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20  NT ? 2 : 1;.    
7c20: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  }.    return sql
7c30: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b  ite3_os_type==2;
7c40: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
7c50: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
7c60: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
7c70: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
7c80: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
7c90: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a  tes of memory..*
7ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
7cb0: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  inMemMalloc(int 
7cc0: 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c  nBytes){.  HANDL
7cd0: 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20  E hHeap;.  void 
7ce0: 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  *p;..  winMemAss
7cf0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
7d00: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
7d10: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
7d20: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
7d30: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
7d40: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
7d50: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
7d60: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
7d70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
7d80: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
7d90: 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f  TE).  assert ( o
7da0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
7db0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
7dc0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
7dd0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
7de0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
7df0: 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61  0 );.  p = osHea
7e00: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
7e10: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
7e20: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
7e30: 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70  Bytes);.  if( !p
7e40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7e50: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
7e60: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
7e70: 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20  pAlloc %u bytes 
7e80: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ea0: 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73  nBytes, osGetLas
7eb0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
7ec0: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72  )hHeap);.  }.  r
7ed0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
7ee0: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a  * Free memory..*
7ef0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
7f00: 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  nMemFree(void *p
7f10: 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45  Prior){.  HANDLE
7f20: 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65   hHeap;..  winMe
7f30: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
7f40: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
7f50: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
7f60: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
7f70: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
7f80: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
7f90: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
7fa0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
7fb0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
7fc0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
7fd0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
7fe0: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
7ff0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
8000: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
8010: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
8020: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
8030: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
8040: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
8050: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
8060: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
8070: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
8080: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8090: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
80a0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
80b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
80c0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
80d0: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
80e0: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
80f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8100: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
8110: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
8120: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
8130: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
8140: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
8150: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
8160: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
8170: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
8180: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
8190: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
81a0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
81b0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
81c0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
81d0: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
81e0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
81f0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
8200: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
8210: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
8220: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
8230: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
8240: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
8250: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
8260: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
8270: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
8280: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
8290: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
82a0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
82b0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
82c0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
82d0: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
82e0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
82f0: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
8300: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
8310: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
8320: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
8330: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
8340: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
8350: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
8360: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
8370: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
8380: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
8390: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
83a0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
83b0: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
83c0: 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  s (%d), heap=%p"
83d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
83e0: 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70    pPrior ? "Heap
83f0: 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70  ReAlloc" : "Heap
8400: 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20  Alloc", nBytes, 
8410: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
8420: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8430: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
8440: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
8450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8460: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
8470: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
8480: 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73  cation, in bytes
8490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
84a0: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
84b0: 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  *p){.  HANDLE hH
84c0: 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b  eap;.  SIZE_T n;
84d0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
84e0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
84f0: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
8500: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
8510: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
8520: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
8530: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
8540: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
8550: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
8560: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8570: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
8580: 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65  .  assert ( osHe
8590: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
85a0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
85b0: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
85c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
85d0: 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
85e0: 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65    n = osHeapSize
85f0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
8600: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
8610: 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53   p);.  if( n==(S
8620: 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20  IZE_T)-1 ){.    
8630: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
8640: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
8650: 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c  d to HeapSize bl
8660: 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61  ock %p (%d), hea
8670: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
8680: 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c         p, osGetL
8690: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
86a0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72  d*)hHeap);.    r
86b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
86c0: 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a  eturn (int)n;.}.
86d0: 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20  ./*.** Round up 
86e0: 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74  a request size t
86f0: 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64  o the next valid
8700: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
8710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8720: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
8730: 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e  t n){.  return n
8740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
8750: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
8760: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8770: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
8780: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
8790: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
87a0: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
87b0: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
87c0: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
87d0: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51  Data ) return SQ
87e0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73  LITE_ERROR;.  as
87f0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
8800: 61 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d  a->magic==WINMEM
8810: 5f 4d 41 47 49 43 20 29 3b 0a 0a 23 69 66 20 21  _MAGIC );..#if !
8820: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8830: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
8840: 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66  HEAP_CREATE.  if
8850: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
8860: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 70 57 69  hHeap ){.    pWi
8870: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
8880: 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65 28 53  = osHeapCreate(S
8890: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
88a0: 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
88d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
88e0: 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20 20 20 20  INIT_SIZE,.     
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
8920: 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20  AP_MAX_SIZE);.  
8930: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
8940: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
8950: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
8960: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20  QLITE_NOMEM,.   
8970: 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74         "failed t
8980: 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25 64  o HeapCreate (%d
8990: 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69  ), flags=%u, ini
89a0: 74 53 69 7a 65 3d 25 75 2c 20 6d 61 78 53 69 7a  tSize=%u, maxSiz
89b0: 65 3d 25 75 22 2c 0a 20 20 20 20 20 20 20 20 20  e=%u",.         
89c0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
89d0: 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ), SQLITE_WIN32_
89e0: 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20  HEAP_FLAGS,.    
89f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
8a00: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
8a10: 45 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  E, SQLITE_WIN32_
8a20: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a  HEAP_MAX_SIZE);.
8a30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8a40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
8a50: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
8a60: 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b  ->bOwned = TRUE;
8a70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
8a80: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
8a90: 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
8aa0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
8ab0: 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73  ap = osGetProces
8ac0: 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21  sHeap();.  if( !
8ad0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
8ae0: 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ap ){.    sqlite
8af0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
8b00: 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69  EM,.        "fai
8b10: 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73  led to GetProces
8b20: 73 48 65 61 70 20 28 25 64 29 22 2c 20 6f 73 47  sHeap (%d)", osG
8b30: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
8b40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8b50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
8b60: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
8b70: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73  ed = FALSE;.  as
8b80: 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44 61  sert( !pWinMemDa
8b90: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65  ta->bOwned );.#e
8ba0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
8bb0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
8bc0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
8bd0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
8be0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
8bf0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
8c00: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
8c10: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
8c20: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
8c30: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
8c40: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
8c50: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
8c60: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
8c70: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
8c80: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
8c90: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
8ca0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
8cb0: 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73  einitialize this
8cc0: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
8cd0: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
8ce0: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
8cf0: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
8d00: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
8d10: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
8d20: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
8d30: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
8d40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
8d50: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
8d60: 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ap ){.    assert
8d70: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
8d80: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
8d90: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
8da0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
8db0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
8dc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
8dd0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20  C_VALIDATE).    
8de0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
8df0: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
8e00: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
8e10: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
8e20: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
8e30: 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e  dif.    if( pWin
8e40: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
8e50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
8e60: 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e  HeapDestroy(pWin
8e70: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20  MemData->hHeap) 
8e80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8e90: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
8ea0: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
8eb0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64 29  HeapDestroy (%d)
8ec0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
8ef0: 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d  , (void*)pWinMem
8f00: 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20  Data->hHeap);.  
8f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e      }.      pWin
8f20: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
8f30: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
8f40: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
8f50: 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hHeap = NULL;.  
8f60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  }.}../*.** Popul
8f70: 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65  ate the low-leve
8f80: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
8f90: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ion function poi
8fa0: 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69  nters in.** sqli
8fb0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
8fc0: 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  m with pointers 
8fd0: 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20  to the routines 
8fe0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68  in this file. Th
8ff0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73  e.** arguments s
9000: 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b  pecify the block
9010: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61   of memory to ma
9020: 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nage..**.** This
9030: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
9040: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
9050: 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64  e3_config(), and
9060: 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73   therefore.** is
9070: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
9080: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28   be threadsafe (
9090: 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63  it is not)..*/.c
90a0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
90b0: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
90c0: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
90d0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
90e0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
90f0: 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74  ethods winMemMet
9100: 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e  hods = {.    win
9110: 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  MemMalloc,.    w
9120: 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77  inMemFree,.    w
9130: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20  inMemRealloc,.  
9140: 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20    winMemSize,.  
9150: 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c    winMemRoundup,
9160: 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c  .    winMemInit,
9170: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64  .    winMemShutd
9180: 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65  own,.    &win_me
9190: 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65  m_data.  };.  re
91a0: 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68  turn &winMemMeth
91b0: 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  ods;.}..void sql
91c0: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
91d0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  t(void){.  sqlit
91e0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
91f0: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20  _CONFIG_MALLOC, 
9200: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
9210: 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  32());.}.#endif 
9220: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
9230: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
9240: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
9250: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
9260: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54  soft Unicode (UT
9270: 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53  F-16?). .**.** S
9280: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
9290: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
92a0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
92b0: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  m malloc..*/.sta
92c0: 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38 54  tic LPWSTR utf8T
92d0: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
92e0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
92f0: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20  .  int nChar;.  
9300: 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  LPWSTR zWideFile
9310: 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  name;..  nChar =
9320: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
9330: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
9340: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
9350: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66  , NULL, 0);.  if
9360: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
9370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
9380: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
9390: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
93a0: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  ( nChar*sizeof(z
93b0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
93c0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
93d0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
93e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
93f0: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
9400: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
9410: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
9420: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
9430: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29            nChar)
9460: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
9470: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9480: 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61  free(zWideFilena
9490: 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69  me);.    zWideFi
94a0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
94b0: 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69    return zWideFi
94c0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
94d0: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
94e0: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54  ft Unicode to UT
94f0: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
9500: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
9510: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62   string is.** ob
9520: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
9530: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
9540: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
9550: 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57  icodeToUtf8(LPCW
9560: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
9570: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
9580: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
9590: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  me;..  nByte = o
95a0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
95b0: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
95c0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
95d0: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
95e0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
95f0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9600: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
9610: 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
9620: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
9630: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
9640: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
9650: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
9660: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
9670: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
9680: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
9690: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
96a0: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
96d0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
96e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
96f0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
9700: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
9710: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9720: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
9730: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
9740: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
9750: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
9760: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
9770: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
9780: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
9790: 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20  le apis..** .** 
97a0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
97b0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
97c0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
97d0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
97e0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
97f0: 4c 50 57 53 54 52 20 6d 62 63 73 54 6f 55 6e 69  LPWSTR mbcsToUni
9800: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
9810: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
9820: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53  nt nByte;.  LPWS
9830: 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  TR zMbcsFilename
9840: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
9850: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
9860: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
9870: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
9880: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
9890: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
98a0: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
98b0: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20  ame, -1, NULL,. 
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
98e0: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
98f0: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
9900: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9910: 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65  .  }.  zMbcsFile
9920: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
9930: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
9940: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
9950: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
9960: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
9970: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9980: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
9990: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
99a0: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
99b0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
99c0: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a   zMbcsFilename,.
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
9a00: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
9a10: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
9a20: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
9a30: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30  MbcsFilename = 0
9a40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9a50: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  MbcsFilename;.}.
9a60: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
9a70: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
9a80: 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63   to multi-byte c
9a90: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
9aa0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
9ab0: 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64   user's ANSI cod
9ac0: 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  epage..**.** Spa
9ad0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
9ae0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
9af0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
9b00: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
9b10: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
9b20: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62  har *unicodeToMb
9b30: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
9b40: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
9b50: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
9b60: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
9b70: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
9b80: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
9b90: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
9ba0: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
9bb0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
9bc0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
9bd0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
9be0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
9bf0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
9c00: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
9c10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
9c20: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  name = sqlite3_m
9c30: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
9c40: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
9c50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9c60: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
9c70: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
9c80: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
9c90: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
9ca0: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
9cb0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
9ce0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
9cf0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9d00: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
9d10: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
9d20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
9d30: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
9d40: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75  /*.** Convert mu
9d50: 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65  ltibyte characte
9d60: 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  r string to UTF-
9d70: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
9d80: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
9d90: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
9da0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
9db0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
9dc0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
9dd0: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
9de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
9df0: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
9e00: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20  zFilenameUtf8;. 
9e10: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
9e20: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
9e30: 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46  mbcsToUnicode(zF
9e40: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
9e50: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
9e60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9e70: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  .  zFilenameUtf8
9e80: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
9e90: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
9ea0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
9eb0: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
9ec0: 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a  FilenameUtf8;.}.
9ed0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55  ./*.** Convert U
9ee0: 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74  TF-8 to multibyt
9ef0: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
9f00: 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ng.  Space to ho
9f10: 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  ld the .** retur
9f20: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
9f30: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
9f40: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
9f50: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
9f60: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
9f70: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  s(const char *zF
9f80: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
9f90: 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b   *zFilenameMbcs;
9fa0: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
9fb0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
9fc0: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
9fd0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
9fe0: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
9ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a000: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62   }.  zFilenameMb
a010: 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62  cs = unicodeToMb
a020: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
a030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
a040: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
a050: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
a060: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  }.../*.** The re
a070: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 65  turn value of ge
a080: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
a090: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
a0a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
a0b0: 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
a0c0: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
a0d0: 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
a0e0: 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
a0f0: 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
a100: 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74  atic int getLast
a110: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
a120: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
a130: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
a140: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
a150: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
a160: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
a170: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
a180: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
a190: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
a1a0: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
a1b0: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
a1c0: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
a1d0: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
a1e0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
a1f0: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
a200: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
a210: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66  f( isNT() ){.#if
a220: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
a230: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
a240: 57 69 64 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  Wide[MAX_PATH+1]
a250: 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f 6d 65 77  ; /* NOTE: Somew
a260: 68 61 74 20 61 72 62 69 74 72 61 72 79 2e 20 2a  hat arbitrary. *
a270: 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  /.    dwLen = os
a280: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
a290: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
a2a0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
a2d0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
a2e0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
a330: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41 54 48          MAX_PATH
a3a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
a3c0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57  );.#else.    LPW
a3d0: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  STR zTempWide = 
a3e0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
a3f0: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
a400: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
a410: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
a420: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
a450: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a470: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
a480: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
a490: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
a4e0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a520: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
a530: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20      0);.#endif. 
a580: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
a590: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
a5a0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
a5b0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
a5c0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
a5d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a5e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
a5f0: 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ut = unicodeToUt
a600: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
a610: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
a620: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
a630: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
a640: 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  NRT.      /* fre
a650: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
a660: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
a670: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
a680: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
a690: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
a6a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
a6b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
a6c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
a6d0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
a6e0: 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zTemp = NULL;.  
a6f0: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
a700: 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41  atMessageA(FORMA
a710: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
a720: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
a750: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
a760: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
a790: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
a7a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
a7c0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7e0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
a830: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
a880: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
a890: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
a8a0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
a8b0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
a8c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
a8d0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
a8e0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
a8f0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
a900: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
a910: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
a920: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
a930: 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  ();.      /* fre
a940: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
a950: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
a960: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
a970: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
a980: 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
a990: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
a9a0: 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b  f( 0 == dwLen ){
a9b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
a9c0: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
a9d0: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78 20  , "OsError 0x%x 
a9e0: 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f  (%u)", lastErrno
a9f0: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20  , lastErrno);.  
aa00: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
aa10: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
aa20: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
aa30: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
aa40: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
aa50: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
aa60: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
aa70: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
aa80: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
aa90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
aaa0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
aab0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   0;.}../*.**.** 
aac0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
aad0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
aae0: 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76  e() - is only ev
aaf0: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
ab00: 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f  e macro.** winLo
ab10: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
ab20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ab30: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
ab40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
ab50: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e   an OS function.
ab60: 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  .** It logs a me
ab70: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
ab80: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
ab90: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
aba0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
abb0: 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20  or code and, if 
abc0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
abd0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
abe0: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a  ivalent from .**
abf0: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a   FormatMessage..
ac00: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
ac10: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
ac20: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
ac30: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
ac40: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
ac50: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
ac60: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
ac70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
ac80: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
ac90: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
aca0: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
acb0: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
acc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
acd0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
ace0: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20  t.** failed and 
acf0: 74 68 65 20 74 68 65 20 61 73 73 6f 63 69 61 74  the the associat
ad00: 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70  ed file-system p
ad10: 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ath, if any..*/.
ad20: 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72  #define winLogEr
ad30: 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77  ror(a,b,c,d)   w
ad40: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
ad50: 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f  (a,b,c,d,__LINE_
ad60: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  _).static int wi
ad70: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
ad80: 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20  .  int errcode, 
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72     /* SQLite err
adb0: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f  or code */.  DWO
adc0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20  RD lastErrno,   
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ade0: 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72  Win32 last error
adf0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ae00: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
ae10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
ae20: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
ae30: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
ae40: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae60: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
ae70: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
ae80: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
aeb0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
aec0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
aed0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d   */.){.  char zM
aee0: 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20  sg[500];        
aef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61           /* Huma
af00: 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n readable error
af10: 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69   text */.  int i
af20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
af30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
af40: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
af50: 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20   zMsg[0] = 0;.  
af60: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
af70: 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f  lastErrno, sizeo
af80: 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a  f(zMsg), zMsg);.
af90: 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
afa0: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
afb0: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
afc0: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66   zPath = "";.  f
afd0: 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20  or(i=0; zMsg[i] 
afe0: 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27  && zMsg[i]!='\r'
aff0: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e   && zMsg[i]!='\n
b000: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67  '; i++){}.  zMsg
b010: 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
b020: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
b030: 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a        "os_win.c:
b040: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
b050: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
b060: 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a  ne, lastErrno, z
b070: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73  Func, zPath, zMs
b080: 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  g.  );..  return
b090: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
b0a0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
b0b0: 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52 65   times that a Re
b0c0: 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46  adFile(), WriteF
b0d0: 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74  ile(), and Delet
b0e0: 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20  eFile().** will 
b0f0: 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f  be retried follo
b100: 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65  wing a locking e
b110: 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20  rror - probably 
b120: 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e  caused by .** an
b130: 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  tivirus software
b140: 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74  .  Also the init
b150: 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65  ial delay before
b160: 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79   the first retry
b170: 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69  ..** The delay i
b180: 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c  ncreases linearl
b190: 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72  y with each retr
b1a0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
b1b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
b1c0: 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20  _RETRY.# define 
b1d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
b1e0: 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64  RR_RETRY 10.#end
b1f0: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
b200: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
b210: 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69  TRY_DELAY.# defi
b220: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
b230: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
b240: 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74  Y 25.#endif.stat
b250: 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72  ic int win32Ioer
b260: 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f  rRetry = SQLITE_
b270: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
b280: 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  Y;.static int wi
b290: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
b2a0: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
b2b0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
b2c0: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  LAY;../*.** If a
b2d0: 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57   ReadFile() or W
b2e0: 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72  riteFile() error
b2f0: 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20   occurs, invoke 
b300: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
b310: 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f  to see if it sho
b320: 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20  uld be retried. 
b330: 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20   Return TRUE to 
b340: 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46  retry.  Return F
b350: 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20  ALSE.** to give 
b360: 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  up with an error
b370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b380: 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a  retryIoerr(int *
b390: 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a  pnRetry, DWORD *
b3a0: 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44  pError){.  DWORD
b3b0: 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72   e = osGetLastEr
b3c0: 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e  ror();.  if( *pn
b3d0: 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72  Retry>=win32Ioer
b3e0: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
b3f0: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
b400: 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
b410: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
b420: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d  0;.  }.  if( e==
b430: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
b440: 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  IED ||.      e==
b450: 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41  ERROR_LOCK_VIOLA
b460: 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d  TION ||.      e=
b470: 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56  =ERROR_SHARING_V
b480: 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20  IOLATION ){.    
b490: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
b4a0: 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72 52 65  eep(win32IoerrRe
b4b0: 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52  tryDelay*(1+*pnR
b4c0: 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70  etry));.    ++*p
b4d0: 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75  nRetry;.    retu
b4e0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
b4f0: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70  pError ){.    *p
b500: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20  Error = e;.  }. 
b510: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
b520: 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72  .** Log a I/O er
b530: 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64  ror retry episod
b540: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
b550: 64 20 6c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e  d logIoerr(int n
b560: 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52  Retry){.  if( nR
b570: 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  etry ){.    sqli
b580: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49  te3_log(SQLITE_I
b590: 4f 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65  OERR, .      "de
b5a0: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
b5b0: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
b5c0: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
b5d0: 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
b5e0: 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79  y*nRetry*(nRetry
b5f0: 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d  +1)/2.    );.  }
b600: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
b610: 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  S_WINCE./*******
b620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b660: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69  **.** This secti
b670: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  on contains code
b680: 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e   for WinCE only.
b690: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  .*/./*.** Window
b6a0: 73 20 43 45 20 64 6f 65 73 20 6e 6f 74 20 68 61  s CE does not ha
b6b0: 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29  ve a localtime()
b6c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63   function.  So c
b6d0: 72 65 61 74 65 20 61 0a 2a 2a 20 73 75 62 73 74  reate a.** subst
b6e0: 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  itute..*/.#inclu
b6f0: 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75  de <time.h>.stru
b700: 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c  ct tm *__cdecl l
b710: 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74  ocaltime(const t
b720: 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74  ime_t *t).{.  st
b730: 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79  atic struct tm y
b740: 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d  ;.  FILETIME uTm
b750: 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54  , lTm;.  SYSTEMT
b760: 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74  IME pTm;.  sqlit
b770: 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20  e3_int64 t64;.  
b780: 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20  t64 = *t;.  t64 
b790: 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37  = (t64 + 1164447
b7a0: 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a  3600)*10000000;.
b7b0: 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54    uTm.dwLowDateT
b7c0: 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36  ime = (DWORD)(t6
b7d0: 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b  4 & 0xFFFFFFFF);
b7e0: 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74  .  uTm.dwHighDat
b7f0: 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74  eTime= (DWORD)(t
b800: 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46  64 >> 32);.  osF
b810: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
b820: 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d  leTime(&uTm,&lTm
b830: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
b840: 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d  oSystemTime(&lTm
b850: 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79  ,&pTm);.  y.tm_y
b860: 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20  ear = pTm.wYear 
b870: 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d  - 1900;.  y.tm_m
b880: 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20  on = pTm.wMonth 
b890: 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79  - 1;.  y.tm_wday
b8a0: 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65   = pTm.wDayOfWee
b8b0: 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d  k;.  y.tm_mday =
b8c0: 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74   pTm.wDay;.  y.t
b8d0: 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f  m_hour = pTm.wHo
b8e0: 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d  ur;.  y.tm_min =
b8f0: 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20   pTm.wMinute;.  
b900: 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77  y.tm_sec = pTm.w
b910: 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e  Second;.  return
b920: 20 26 79 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20   &y;.}..#define 
b930: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
b940: 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26  E(a) (winFile*)&
b950: 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74  ((char*)a)[-(int
b960: 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c  )offsetof(winFil
b970: 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  e,h)]../*.** Acq
b980: 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  uire a lock on t
b990: 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73  he handle h.*/.s
b9a0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
b9b0: 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e  MutexAcquire(HAN
b9c0: 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44  DLE h){.   DWORD
b9d0: 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a   dwErr;.   do {.
b9e0: 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57       dwErr = osW
b9f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
ba00: 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b  ct(h, INFINITE);
ba10: 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45  .   } while (dwE
ba20: 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43  rr != WAIT_OBJEC
ba30: 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20  T_0 && dwErr != 
ba40: 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b  WAIT_ABANDONED);
ba50: 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  .}./*.** Release
ba60: 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64   a lock acquired
ba70: 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63   by winceMutexAc
ba80: 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69  quire().*/.#defi
ba90: 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  ne winceMutexRel
baa0: 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d  ease(h) ReleaseM
bab0: 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43  utex(h)../*.** C
bac0: 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20  reate the mutex 
bad0: 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  and shared memor
bae0: 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  y used for locki
baf0: 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ng in the file.*
bb00: 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  * descriptor pFi
bb10: 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  le.*/.static BOO
bb20: 4c 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  L winceCreateLoc
bb30: 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  k(const char *zF
bb40: 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65  ilename, winFile
bb50: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53   *pFile){.  LPWS
bb60: 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54  TR zTok;.  LPWST
bb70: 52 20 7a 4e 61 6d 65 3b 0a 20 20 42 4f 4f 4c 20  R zName;.  BOOL 
bb80: 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20  bInit = TRUE;.. 
bb90: 20 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54 6f 55   zName = utf8ToU
bba0: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
bbb0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
bbc0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20  0 ){.    /* out 
bbd0: 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20  of memory */.   
bbe0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20   return FALSE;. 
bbf0: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
bc00: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
bc10: 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73  ckdata */.  mems
bc20: 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  et(&pFile->local
bc30: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c  , 0, sizeof(pFil
bc40: 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f  e->local));..  /
bc50: 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61  * Replace the ba
bc60: 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74  ckslashes from t
bc70: 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
bc80: 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a  lowercase it.  *
bc90: 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75  * to derive a mu
bca0: 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a  tex name. */.  z
bcb0: 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65  Tok = osCharLowe
bcc0: 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  rW(zName);.  for
bcd0: 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29   (;*zTok;zTok++)
bce0: 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20  {.    if (*zTok 
bcf0: 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d  == '\\') *zTok =
bd00: 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   '_';.  }..  /* 
bd10: 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20  Create/open the 
bd20: 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20  named mutex */. 
bd30: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
bd40: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28   osCreateMutexW(
bd50: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
bd60: 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
bd70: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
bd80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
bd90: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
bda0: 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  r();.    winLogE
bdb0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
bdc0: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
bdd0: 72 6e 6f 2c 20 22 77 69 6e 63 65 43 72 65 61 74  rno, "winceCreat
bde0: 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61  eLock1", zFilena
bdf0: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
be00: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
be10: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
be20: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
be30: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
be40: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
be50: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
be60: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
be70: 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e  ex);.  .  /* Sin
be80: 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ce the names of 
be90: 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73  named mutexes, s
bea0: 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20  emaphores, file 
beb0: 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65  mappings etc are
bec0: 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73   .  ** case-sens
bed0: 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61  itive, take adva
bee0: 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79  ntage of that by
bef0: 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65   uppercasing the
bf00: 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a   mutex name.  **
bf10: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20   and using that 
bf20: 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69  as the shared fi
bf30: 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a  lemapping name..
bf40: 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70    */.  osCharUpp
bf50: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46  erW(zName);.  pF
bf60: 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f  ile->hShared = o
bf70: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
bf80: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
bf90: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
bfd0: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
bfe0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
c020: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
c030: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
c040: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
c050: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
c060: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
c070: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
c080: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
c090: 66 20 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  f (osGetLastErro
c0a0: 72 28 29 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52  r() == ERROR_ALR
c0b0: 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20  EADY_EXISTS){.  
c0c0: 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b    bInit = FALSE;
c0d0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
c0e0: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20  free(zName);..  
c0f0: 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64  /* If we succeed
c100: 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65  ed in making the
c110: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
c120: 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a  andle, map it. *
c130: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  /.  if (pFile->h
c140: 53 68 61 72 65 64 29 7b 0a 20 20 20 20 70 46 69  Shared){.    pFi
c150: 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69  le->shared = (wi
c160: 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69  nceLock*)osMapVi
c170: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
c180: 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20  hShared, .      
c190: 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f         FILE_MAP_
c1a0: 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52  READ|FILE_MAP_WR
c1b0: 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f  ITE, 0, 0, sizeo
c1c0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
c1d0: 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67     /* If mapping
c1e0: 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74   failed, close t
c1f0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
c200: 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73   handle and eras
c210: 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  e it */.    if (
c220: 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 7b  !pFile->shared){
c230: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
c240: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
c250: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
c260: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
c270: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c  LITE_ERROR, pFil
c280: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
c2a0: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c  nceCreateLock2",
c2b0: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
c2c0: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
c2d0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
c2e0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68  ;.      pFile->h
c2f0: 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20  Shared = NULL;. 
c300: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
c310: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
c320: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65  could not be cre
c330: 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ated, then close
c340: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66   the mutex and f
c350: 61 69 6c 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  ail */.  if (pFi
c360: 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 3d 20 4e  le->hShared == N
c370: 55 4c 4c 29 7b 0a 20 20 20 20 77 69 6e 63 65 4d  ULL){.    winceM
c380: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
c390: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
c3a0: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
c3b0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
c3c0: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
c3d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75  = NULL;.    retu
c3e0: 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20  rn FALSE;.  }.  
c3f0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
c400: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
c410: 72 79 20 69 66 20 77 65 27 72 65 20 73 75 70 70  ry if we're supp
c420: 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 20  osed to */.  if 
c430: 28 62 49 6e 69 74 29 20 7b 0a 20 20 20 20 6d 65  (bInit) {.    me
c440: 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72  mset(pFile->shar
c450: 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  ed, 0, sizeof(wi
c460: 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a  nceLock));.  }..
c470: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
c480: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
c490: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 52 55  x);.  return TRU
c4a0: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74  E;.}../*.** Dest
c4b0: 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20  roy the part of 
c4c0: 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61  winFile that dea
c4d0: 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f  ls with wince lo
c4e0: 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  cks.*/.static vo
c4f0: 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  id winceDestroyL
c500: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
c510: 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65  le){.  if (pFile
c520: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f  ->hMutex){.    /
c530: 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
c540: 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
c550: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
c560: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
c570: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
c580: 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64  ng blocks should
c590: 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74   probably assert
c5a0: 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   in debug mode, 
c5b0: 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20  but they.       
c5c0: 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69  are to cleanup i
c5d0: 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73  n case any locks
c5e0: 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a   remained open *
c5f0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
c600: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29  >local.nReaders)
c610: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
c620: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
c630: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
c640: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
c650: 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20  Reserved){.     
c660: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
c670: 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
c680: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
c690: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50  (pFile->local.bP
c6a0: 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70  ending){.      p
c6b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
c6c0: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
c6d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
c6e0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
c6f0: 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46  usive){.      pF
c700: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
c710: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
c720: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
c730: 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20  e-reference and 
c740: 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f  close our copy o
c750: 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  f the shared mem
c760: 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ory handle */.  
c770: 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46    osUnmapViewOfF
c780: 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  ile(pFile->share
c790: 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  d);.    osCloseH
c7a0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  andle(pFile->hSh
c7b0: 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  ared);..    /* D
c7c0: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74  one with the mut
c7d0: 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
c7e0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
c7f0: 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a  e->hMutex);    .
c800: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
c810: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
c820: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
c830: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  tex = NULL;.  }.
c840: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70  }../* .** An imp
c850: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
c860: 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50  he LockFile() AP
c870: 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
c880: 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
c890: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
c8a0: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
c8b0: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
c8c0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
c8d0: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
c8e0: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
c8f0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
c900: 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
c910: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
c920: 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  oLockHigh.){.  w
c930: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
c940: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
c950: 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
c960: 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
c970: 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
c980: 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
c990: 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
c9a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
c9b0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
c9c0: 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
c9d0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
c9e0: 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
c9f0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
ca00: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
ca10: 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e  .  /* Wanting an
ca20: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
ca30: 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
ca40: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
ca50: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
ca60: 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62  .       && nNumb
ca70: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
ca80: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
ca90: 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69  RED_SIZE){.    i
caa0: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
cab0: 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20  ->nReaders == 0 
cac0: 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  && pFile->shared
cad0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
cae0: 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  0){.       pFile
caf0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
cb00: 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
cb10: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
cb20: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  .bExclusive = TR
cb30: 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75  UE;.       bRetu
cb40: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
cb50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
cb60: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b  a read-only lock
cb70: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
cb80: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
cb90: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
cba0: 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20  _FIRST &&.      
cbb0: 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79       nNumberOfBy
cbc0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
cbd0: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
cbe0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
cbf0: 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
cc00: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
cc10: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
cc20: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
cc30: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
cc40: 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  1){.        pFil
cc50: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
cc60: 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ers ++;.      }.
cc70: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
cc80: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
cc90: 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e  .  /* Want a pen
cca0: 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ding lock? */.  
ccb0: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
ccc0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
ccd0: 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  RD)PENDING_BYTE 
cce0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
ccf0: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
cd00: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70  {.    /* If no p
cd10: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
cd20: 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74  been acquired, t
cd30: 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a  hen acquire it *
cd40: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
cd50: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
cd60: 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  g == 0) {.      
cd70: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
cd80: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
cd90: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
cda0: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  al.bPending = TR
cdb0: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
cdc0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
cdd0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
cde0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20   reserved lock? 
cdf0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
ce00: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
ce10: 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
ce20: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
ce30: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
ce40: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
ce50: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
ce60: 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b  Reserved == 0) {
ce70: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
ce80: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
ce90: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
cea0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
ceb0: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
cec0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
ced0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
cee0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
cef0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
cf00: 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75  ;.  return bRetu
cf10: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  rn;.}../*.** An 
cf20: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
cf30: 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  f the UnlockFile
cf40: 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
cf50: 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
cf60: 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63   BOOL winceUnloc
cf70: 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
cf80: 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
cf90: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
cfa0: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
cfb0: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
cfc0: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
cfd0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a  tesToUnlockLow,.
cfe0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
cff0: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
d000: 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
d010: 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
d020: 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
d030: 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
d040: 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
d050: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d060: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
d070: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
d080: 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
d090: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
d0a0: 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65  );..  if (!pFile
d0b0: 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e  ->hMutex) return
d0c0: 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75   TRUE;.  winceMu
d0d0: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
d0e0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
d0f0: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61   Releasing a rea
d100: 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65  der lock or an e
d110: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
d120: 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
d130: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
d140: 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a  )SHARED_FIRST){.
d150: 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61      /* Did we ha
d160: 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
d170: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20  lock? */.    if 
d180: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
d190: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
d1a0: 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
d1b0: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
d1c0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
d1d0: 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  ED_SIZE);.      
d1e0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
d1f0: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
d200: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
d210: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
d220: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
d230: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
d240: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
d250: 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61  d we just have a
d260: 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f   reader lock? */
d270: 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46  .    else if (pF
d280: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
d290: 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ers){.      asse
d2a0: 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
d2b0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
d2c0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
d2d0: 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42  ZE || nNumberOfB
d2e0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
d2f0: 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
d300: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
d310: 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
d320: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
d330: 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
d340: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
d350: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
d360: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
d370: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
d380: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
d390: 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
d3a0: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
d3b0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
d3c0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
d3d0: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
d3e0: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
d3f0: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
d400: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
d410: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50  (pFile->local.bP
d420: 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70  ending){.      p
d430: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
d440: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
d450: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
d460: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  d->bPending = FA
d470: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
d480: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
d490: 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73  .  }.  /* Releas
d4a0: 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20 6c  ing a reserved l
d4b0: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
d4c0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
d4d0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
d4e0: 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75  RVED_BYTE && nNu
d4f0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
d500: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
d510: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
d520: 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
d530: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
d540: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
d550: 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
d560: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
d570: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
d580: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
d590: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
d5a0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
d5b0: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
d5c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
d5d0: 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
d5e0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
d5f0: 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
d600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
d650: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d660: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
d670: 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
d680: 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
d690: 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
d6a0: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
d6b0: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
d6c0: 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
d6d0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
d6e0: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
d6f0: 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
d700: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
d710: 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
d720: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
d730: 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
d740: 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
d750: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
d760: 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
d770: 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
d780: 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
d790: 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
d7a0: 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
d7b0: 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
d7c0: 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
d7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d7e0: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
d7f0: 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
d800: 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
d810: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56  isNT() ){.    OV
d820: 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
d830: 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c     memset(&ovlp,
d840: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
d850: 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c  APPED));.    ovl
d860: 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  p.Offset = offse
d870: 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  tLow;.    ovlp.O
d880: 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73  ffsetHigh = offs
d890: 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75  etHigh;.    retu
d8a0: 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28  rn osLockFileEx(
d8b0: 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  *phFile, flags, 
d8c0: 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
d8d0: 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
d8e0: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
d8f0: 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
d900: 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
d910: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
d920: 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
d930: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d940: 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
d950: 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
d960: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  f.}../*.** Unloc
d970: 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e  k a file region.
d980: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  . */.static BOOL
d990: 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a   winUnlockFile(.
d9a0: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
d9b0: 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  e,.  DWORD offse
d9c0: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66  tLow,.  DWORD of
d9d0: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
d9e0: 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  D numBytesLow,. 
d9f0: 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48   DWORD numBytesH
da00: 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54  igh.){.#if SQLIT
da10: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a  E_OS_WINCE.  /*.
da20: 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
da30: 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
da40: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
da50: 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
da60: 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a  f the Win32.  **
da70: 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63         API Unloc
da80: 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
da90: 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  turn winceUnlock
daa0: 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
dab0: 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
dac0: 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
dae0: 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
daf0: 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20  esHigh);.#else. 
db00: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
db10: 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
db20: 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
db30: 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
db40: 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
db50: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
db60: 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
db70: 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
db80: 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
db90: 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
dba0: 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
dbb0: 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
dbc0: 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
dbd0: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
dbe0: 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
dbf0: 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
dc00: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
dc10: 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
dc20: 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
dc40: 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
dc50: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  endif.}../******
dc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dca0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  *******.** The n
dcb0: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ext group of rou
dcc0: 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
dcd0: 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  the I/O methods 
dce0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
dcf0: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
dd00: 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
dd60: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
dd70: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
dd80: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
dd90: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
dda0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
ddb0: 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
ddc0: 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
ddd0: 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
dde0: 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
ddf0: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
de00: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
de10: 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
de20: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
de30: 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
de40: 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
de50: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
de60: 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
de70: 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a  ful, return 0. .
de80: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
de90: 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t pFile->lastErr
dea0: 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  no and return no
deb0: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
dec0: 63 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c  c int seekWinFil
ded0: 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
dee0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
def0: 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53  iOffset){.#if !S
df00: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
df10: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b   LONG upperBits;
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32   /* Most sig. 32
df40: 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
df50: 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f  set */.  LONG lo
df60: 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  werBits;        
df70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73           /* Leas
df80: 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
df90: 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
dfa0: 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20    DWORD dwRet;  
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
dfd0: 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
dfe0: 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f  inter() */.  DWO
dff0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e010: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
e020: 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
e030: 20 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69 74 73   */..  upperBits
e040: 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73   = (LONG)((iOffs
e050: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
e060: 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69  ffff);.  lowerBi
e070: 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66  ts = (LONG)(iOff
e080: 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
e090: 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64  );..  /* API odd
e0a0: 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66  ity: If successf
e0b0: 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ul, SetFilePoint
e0c0: 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64  er() returns a d
e0d0: 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  word .  ** conta
e0e0: 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20  ining the lower 
e0f0: 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e  32-bits of the n
e100: 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20  ew file-offset. 
e110: 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c  Or, if it fails,
e120: 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  .  ** it returns
e130: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
e140: 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76  E_POINTER. Howev
e150: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
e160: 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41  MSDN, .  ** INVA
e170: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
e180: 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
e190: 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
e1a0: 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
e1b0: 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
e1c0: 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  er an error has 
e1d0: 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 65 64  actually occured
e1e0: 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63  , it is also nec
e1f0: 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a  essary to call .
e200: 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f    ** GetLastErro
e210: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65  r()..  */.  dwRe
e220: 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  t = osSetFilePoi
e230: 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c  nter(pFile->h, l
e240: 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72  owerBits, &upper
e250: 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e  Bits, FILE_BEGIN
e260: 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74  );..  if( (dwRet
e270: 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  ==INVALID_SET_FI
e280: 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20  LE_POINTER.     
e290: 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
e2a0: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
e2b0: 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20  ())!=NO_ERROR)) 
e2c0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
e2d0: 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
e2e0: 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
e2f0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
e300: 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c  R_SEEK, pFile->l
e310: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
e320: 20 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e 46         "seekWinF
e330: 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ile", pFile->zPa
e340: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  th);.    return 
e350: 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
e360: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
e370: 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
e380: 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
e390: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
e3a0: 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
e3b0: 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
e3c0: 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e3e0: 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
e3f0: 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
e420: 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
e430: 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
e440: 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
e450: 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
e460: 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
e470: 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
e480: 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
e490: 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
e4a0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
e4b0: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
e4c0: 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
e4d0: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
e4e0: 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
e4f0: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
e500: 20 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69           "seekWi
e510: 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  nFile", pFile->z
e520: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
e530: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  n 1;.  }..  retu
e540: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
e550: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
e560: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  le..**.** It is 
e570: 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e  reported that an
e580: 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73   attempt to clos
e590: 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74  e a handle might
e5a0: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61   sometimes.** fa
e5b0: 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76  il.  This is a v
e5c0: 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65  ery unreasonable
e5d0: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e   result, but Win
e5e0: 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75  dows is notoriou
e5f0: 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75  s.** for being u
e600: 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49  nreasonable so I
e610: 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68   do not doubt th
e620: 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70  at it might happ
e630: 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63  en.  If.** the c
e640: 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70  lose fails, we p
e650: 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c  ause for 100 mil
e660: 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
e670: 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20  y again.  As.** 
e680: 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45  many as MX_CLOSE
e690: 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74  _ATTEMPT attempt
e6a0: 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68  s to close the h
e6b0: 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62  andle are made b
e6c0: 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20  efore.** giving 
e6d0: 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
e6e0: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64   an error..*/.#d
e6f0: 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41  efine MX_CLOSE_A
e700: 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20  TTEMPT 3.static 
e710: 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c  int winClose(sql
e720: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
e730: 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20    int rc, cnt = 
e740: 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  0;.  winFile *pF
e750: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
e760: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  id;..  assert( i
e770: 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
e780: 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30  ( pFile->pShm==0
e790: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
e7a0: 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69  CLOSE %d\n", pFi
e7b0: 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b 0a 20  le->h));.  do{. 
e7c0: 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48     rc = osCloseH
e7d0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
e7e0: 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65  .    /* Simulate
e7f0: 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63  IOError( rc=0; c
e800: 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  nt=MX_CLOSE_ATTE
e810: 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68  MPT; ); */.  }wh
e820: 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b  ile( rc==0 && ++
e830: 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  cnt < MX_CLOSE_A
e840: 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74  TTEMPT && (sqlit
e850: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
e860: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
e870: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
e880: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
e890: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
e8a0: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
e8b0: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
e8c0: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
e8d0: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
e8e0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
e8f0: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
e900: 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
e910: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
e920: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
e930: 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
e940: 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
e950: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
e960: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
e970: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
e980: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
e990: 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
e9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
e9b0: 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b  in32_sleep(100);
e9c0: 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
e9d0: 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
e9e0: 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
e9f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ea00: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
ea10: 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
ea20: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
ea30: 43 4c 4f 53 45 20 25 64 20 25 73 5c 6e 22 2c 20  CLOSE %d %s\n", 
ea40: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
ea50: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
ea60: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
ea70: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c    pFile->h = NUL
ea80: 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75  L;.  }.  OpenCou
ea90: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75  nter(-1);.  retu
eaa0: 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f  rn rc ? SQLITE_O
eab0: 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  K.            : 
eac0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
ead0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
eae0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
eaf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
eb10: 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  Close", pFile->z
eb20: 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
eb30: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
eb40: 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
eb50: 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
eb60: 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
eb70: 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
eb80: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
eb90: 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
eba0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
ebb0: 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
ebc0: 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28  tic int winRead(
ebd0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
ebe0: 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *id,          /*
ebf0: 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72   File to read fr
ec00: 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  om */.  void *pB
ec10: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
ec20: 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74     /* Write cont
ec30: 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ent into this bu
ec40: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  ffer */.  int am
ec50: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
ec60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ec70: 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
ec80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
ec90: 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
eca0: 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
ecb0: 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20   at this offset 
ecc0: 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  */.){.#if !SQLIT
ecd0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4f 56 45  E_OS_WINCE.  OVE
ece0: 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70  RLAPPED overlapp
ecf0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
ed00: 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52  The offset for R
ed10: 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  eadFile. */.#end
ed20: 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  if.  winFile *pF
ed30: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
ed40: 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e  id;  /* file han
ed50: 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e  dle */.  DWORD n
ed60: 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  Read;           
ed70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ed80: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
ed90: 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66  ally read from f
eda0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ile */.  int nRe
edb0: 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
edc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
edd0: 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a  er of retrys */.
ede0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
edf0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
ee00: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
ee10: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
ee20: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
ee30: 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  D %d lock=%d\n",
ee40: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
ee50: 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
ee60: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ee70: 43 45 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e  CE.  if( seekWin
ee80: 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
ee90: 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  et) ){.    retur
eea0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
eeb0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52   }.  while( !osR
eec0: 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
eed0: 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
eee0: 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ead, 0) ){.#else
eef0: 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c  .  memset(&overl
ef00: 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
ef10: 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
ef20: 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
ef30: 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
ef40: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
ef50: 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
ef60: 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
ef70: 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
ef80: 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
ef90: 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
efa0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
efb0: 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
efc0: 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26   &overlapped) &&
efd0: 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c  .         osGetL
efe0: 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f  astError()!=ERRO
eff0: 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a  R_HANDLE_EOF ){.
f000: 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44  #endif.    DWORD
f010: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
f020: 69 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26  if( retryIoerr(&
f030: 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72  nRetry, &lastErr
f040: 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  no) ) continue;.
f050: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
f060: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
f070: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
f080: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
f090: 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c  IOERR_READ, pFil
f0a0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
f0b0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52             "winR
f0c0: 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ead", pFile->zPa
f0d0: 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f  th);.  }.  logIo
f0e0: 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69  err(nRetry);.  i
f0f0: 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29  f( nRead<(DWORD)
f100: 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e  amt ){.    /* Un
f110: 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
f120: 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
f130: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
f140: 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
f150: 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d  ar*)pBuf)[nRead]
f160: 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b  , 0, amt-nRead);
f170: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f180: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
f190: 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  EAD;.  }..  retu
f1a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f1b0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
f1c0: 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
f1d0: 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
f1e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
f1f0: 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
f200: 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
f210: 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
f220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f230: 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69  winWrite(.  sqli
f240: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
f250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
f260: 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ile to write int
f270: 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  o */.  const voi
f280: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
f290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
f2a0: 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  tes to be writte
f2b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  n */.  int amt, 
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f2e0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
f2f0: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  te */.  sqlite3_
f300: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
f310: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f320: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  t into the file 
f330: 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67  to begin writing
f340: 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   at */.){.  int 
f350: 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
f360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f370: 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 61 73  rue if error has
f380: 20 6f 63 63 75 72 65 64 2c 20 65 6c 73 65 20 66   occured, else f
f390: 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  alse */.  winFil
f3a0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
f3b0: 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c  ile*)id;  /* Fil
f3c0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
f3d0: 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f3f0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69   Number of retri
f400: 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
f410: 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
f420: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
f430: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
f440: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
f450: 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
f460: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
f470: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
f480: 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41  _FULL);..  OSTRA
f490: 43 45 28 28 22 57 52 49 54 45 20 25 64 20 6c 6f  CE(("WRITE %d lo
f4a0: 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
f4b0: 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
f4c0: 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
f4d0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63  TE_OS_WINCE.  rc
f4e0: 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70   = seekWinFile(p
f4f0: 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  File, offset);. 
f500: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65   if( rc==0 ){.#e
f510: 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23  lse.  {.#endif.#
f520: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
f530: 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50  NCE.    OVERLAPP
f540: 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20  ED overlapped;  
f550: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
f560: 73 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c  set for WriteFil
f570: 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  e. */.#endif.   
f580: 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20   u8 *aRem = (u8 
f590: 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f  *)pBuf;        /
f5a0: 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65  * Data yet to be
f5b0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
f5c0: 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20  int nRem = amt; 
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f5e0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
f5f0: 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
f600: 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  en */.    DWORD 
f610: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
f620: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
f630: 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68   written by each
f640: 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c   WriteFile() cal
f650: 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c  l */.    DWORD l
f660: 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
f670: 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20  ROR;   /* Value 
f680: 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
f690: 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23  astError() */..#
f6a0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
f6b0: 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  NCE.    memset(&
f6c0: 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
f6d0: 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
f6e0: 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  ));.    overlapp
f6f0: 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
f700: 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
f710: 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65  ffffff);.    ove
f720: 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
f730: 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
f740: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
f750: 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a  fffff);.#endif..
f760: 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e      while( nRem>
f770: 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  0 ){.#if SQLITE_
f780: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69  OS_WINCE.      i
f790: 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
f7a0: 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
f7b0: 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30  nRem, &nWrite, 0
f7c0: 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ) ){.#else.     
f7d0: 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
f7e0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
f7f0: 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
f800: 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b   &overlapped) ){
f810: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
f820: 69 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26  if( retryIoerr(&
f830: 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72  nRetry, &lastErr
f840: 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  no) ) continue;.
f850: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f870: 20 6e 57 72 69 74 65 3c 3d 30 20 29 7b 0a 20 20   nWrite<=0 ){.  
f880: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
f890: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
f8a0: 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
f8b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  k;.      }.#if !
f8c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
f8d0: 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
f8e0: 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76  nWrite;.      ov
f8f0: 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
f900: 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
f910: 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
f920: 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
f930: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
f940: 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
f950: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
f960: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65  #endif.      aRe
f970: 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m += nWrite;.   
f980: 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74     nRem -= nWrit
f990: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
f9a0: 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
f9b0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f9c0: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
f9d0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
f9e0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
f9f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20   ){.    if(   ( 
fa00: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fa10: 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44  ==ERROR_HANDLE_D
fa20: 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20  ISK_FULL ).     
fa30: 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61    || ( pFile->la
fa40: 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44  stErrno==ERROR_D
fa50: 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20  ISK_FULL )){.   
fa60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fa70: 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
fa80: 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
fa90: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
faa0: 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  _WRITE, pFile->l
fab0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
fac0: 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65         "winWrite
fad0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
fae0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
faf0: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
fb00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
fb10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fb20: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
fb30: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
fb40: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
fb50: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
fb60: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
fb70: 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
fb80: 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
fb90: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
fba0: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
fbb0: 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
fbc0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
fbd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
fbe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
fbf0: 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
fc00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
fc10: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
fc20: 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
fc30: 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64  TRUNCATE %d %lld
fc40: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
fc50: 42 79 74 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61  Byte));.  Simula
fc60: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
fc70: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
fc80: 55 4e 43 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49  UNCATE);..  /* I
fc90: 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
fca0: 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
fcb0: 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
fcc0: 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
fcd0: 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
fce0: 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
fcf0: 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
fd00: 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
fd10: 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
fd20: 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
fd30: 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
fd40: 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
fd50: 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
fd60: 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
fd70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
fd80: 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
fd90: 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
fda0: 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
fdb0: 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
fdc0: 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
fdd0: 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
fde0: 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69  .  /* SetEndOfFi
fdf0: 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e  le() returns non
fe00: 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65  -zero when succe
fe10: 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77  ssful, or zero w
fe20: 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  hen it fails. */
fe30: 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69  .  if( seekWinFi
fe40: 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29  le(pFile, nByte)
fe50: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
fe60: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
fe70: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
fe80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fe90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
fea0: 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70  winTruncate1", p
feb0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
fec0: 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53  }else if( 0==osS
fed0: 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c  etEndOfFile(pFil
fee0: 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70 46 69  e->h) ){.    pFi
fef0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
ff00: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
ff10: 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
ff20: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
ff30: 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
ff40: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
ff60: 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69  nTruncate2", pFi
ff70: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
ff80: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
ff90: 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73  NCATE %d %lld %s
ffa0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
ffb0: 42 79 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c  Byte, rc ? "fail
ffc0: 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20  ed" : "ok"));.  
ffd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
ffe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
fff0: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
10000 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
10010 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
10020 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
10030 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
10040 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
10050 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
10060 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
10070 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
10080 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
10090 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
100a0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
100b0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
100c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
100d0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
100e0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
100f0 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
10100 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
10110 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71  c int winSync(sq
10120 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
10130 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e  int flags){.#ifn
10140 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
10150 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  NC.  /*.  ** Use
10160 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49  d only when SQLI
10170 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
10180 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f  t defined..   */
10190 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64  .  BOOL rc;.#end
101a0 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
101b0 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69  NDEBUG) || !defi
101c0 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
101d0 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65  NC) || \.    (de
101e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
101f0 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
10200 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f  LITE_DEBUG)).  /
10210 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e  *.  ** Used when
10220 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
10230 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61  is not defined a
10240 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  nd by the assert
10250 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f  () and/or.  ** O
10260 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e  STRACE() macros.
10270 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  .   */.  winFile
10280 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
10290 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20  le*)id;.#else.  
102a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
102b0 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  (id);.#endif..  
102c0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
102d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
102e0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
102f0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
10300 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
10310 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
10320 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
10330 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
10340 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
10350 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
10360 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41  LL.  );..  OSTRA
10370 43 45 28 28 22 53 59 4e 43 20 25 64 20 6c 6f 63  CE(("SYNC %d loc
10380 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
10390 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
103a0 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  pe));..  /* Unix
103b0 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
103c0 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
103d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
103e0 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
103f0 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
10400 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
10410 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
10420 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
10430 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
10440 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
10450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
10460 4c 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  L );..#ifndef SQ
10470 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53  LITE_TEST.  UNUS
10480 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61  ED_PARAMETER(fla
10490 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gs);.#else.  if(
104a0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
104b0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
104c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
104d0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
104e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
104f0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
10500 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
10510 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
10520 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
10530 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
10540 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
10550 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
10560 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
10570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10580 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  K;.#else.  rc = 
10590 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
105a0 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  rs(pFile->h);.  
105b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
105c0 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69   rc=FALSE );.  i
105d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
105e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
105f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
10600 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
10610 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
10620 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
10630 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
10640 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
10650 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
10660 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
10670 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
10680 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  th);.  }.#endif.
10690 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
106a0 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
106b0 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
106c0 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
106d0 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65   int winFileSize
106e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
106f0 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
10700 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46   *pSize){.  winF
10710 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
10720 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
10730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10740 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
10750 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
10760 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
10770 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
10780 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
10790 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46  _WINRT.  {.    F
107a0 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46  ILE_STANDARD_INF
107b0 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  O info;.    if( 
107c0 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
107d0 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70  tionByHandleEx(p
107e0 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61  File->h, FileSta
107f0 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20  ndardInfo,.     
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  &info, sizeof(in
10830 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  fo)) ){.      *p
10840 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f  Size = info.EndO
10850 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a  fFile.QuadPart;.
10860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10870 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10880 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
10890 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
108a0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
108b0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
108c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
108d0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
108e0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69            "winFi
108f0 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e  leSize", pFile->
10900 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
10910 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20  }.#else.  {.    
10920 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b  DWORD upperBits;
10930 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72  .    DWORD lower
10940 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  Bits;.    DWORD 
10950 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20  lastErrno;..    
10960 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65  lowerBits = osGe
10970 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d  tFileSize(pFile-
10980 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b  >h, &upperBits);
10990 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28  .    *pSize = ((
109a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75  (sqlite3_int64)u
109b0 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b  pperBits)<<32) +
109c0 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
109d0 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73  if(   (lowerBits
109e0 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   == INVALID_FILE
109f0 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26  _SIZE).       &&
10a00 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
10a10 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
10a20 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20  !=NO_ERROR) ){. 
10a30 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
10a40 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
10a50 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  o;.      rc = wi
10a60 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10a70 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
10a80 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
10a90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
10aa0 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
10ab0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
10ac0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
10ad0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10ae0 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  * LOCKFILE_FAIL_
10af0 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75  IMMEDIATELY is u
10b00 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65  ndefined on some
10b10 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
10b20 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43  ..*/.#ifndef LOC
10b30 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
10b40 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20  IATELY.# define 
10b50 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
10b60 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64  MEDIATELY 1.#end
10b70 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  if..#ifndef LOCK
10b80 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
10b90 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  OCK.# define LOC
10ba0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
10bb0 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 2.#endif../
10bc0 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c  *.** Historicall
10bd0 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75 73  y, SQLite has us
10be0 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b  ed both the Lock
10bf0 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c  File and LockFil
10c00 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  eEx functions..*
10c10 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46  * When the LockF
10c20 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  ile function was
10c30 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c   used, it was al
10c40 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f  ways expected to
10c50 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61   fail.** immedia
10c60 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
10c70 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62   could not be ob
10c80 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69  tained.  Also, i
10c90 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65  t always expecte
10ca0 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61  d to.** obtain a
10cb0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
10cc0 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 61  .  These flags a
10cd0 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65  re used with the
10ce0 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
10cf0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c  tion.** and refl
10d00 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63 74  ect those expect
10d10 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72  ations; therefor
10d20 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e  e, they should n
10d30 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  ot be changed..*
10d40 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10d50 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a  _LOCKFILE_FLAGS.
10d60 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
10d70 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20  LOCKFILE_FLAGS  
10d80 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f   (LOCKFILE_FAIL_
10d90 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a  IMMEDIATELY | \.
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55    LOCKFILE_EXCLU
10dd0 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69  SIVE_LOCK).#endi
10de0 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74  f../*.** Current
10df0 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72  ly, SQLite never
10e00 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46   calls the LockF
10e10 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77  ileEx function w
10e20 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74  ithout wanting t
10e30 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61  he.** call to fa
10e40 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  il immediately i
10e50 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
10e60 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a  t be obtained..*
10e70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10e80 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
10e90 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
10ea0 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
10eb0 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  GS (LOCKFILE_FAI
10ec0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23  L_IMMEDIATELY).#
10ed0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  endif../*.** Acq
10ee0 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f  uire a reader lo
10ef0 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ck..** Different
10f00 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
10f10 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69  e called dependi
10f20 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
10f30 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20   not this.** is 
10f40 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a  Win9x or WinNT..
10f50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
10f60 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  tReadLock(winFil
10f70 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
10f80 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
10f90 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
10fa0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a  _OS_WINCE.    /*
10fb0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  .    ** NOTE: Wi
10fc0 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
10fd0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
10fe0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
10ff0 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
11000 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20     **       API 
11010 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20  LockFileEx..    
11020 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  */.    res = win
11030 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  ceLockFile(&pFil
11040 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
11050 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  ST, 0, 1, 0);.#e
11060 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69  lse.    res = wi
11070 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
11080 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
11090 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48  FILEEX_FLAGS, SH
110a0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
110d0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
110e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
110f0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
11100 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
11110 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
11120 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
11130 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
11140 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
11150 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28  Byte = (short)((
11160 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
11170 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
11180 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  1));.    res = w
11190 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
111a0 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
111b0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
111e0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
111f0 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
11200 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
11210 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
11220 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11230 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11240 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  ror();.    /* No
11250 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66   need to log a f
11260 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a  ailure to lock *
11270 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
11280 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  es;.}../*.** Und
11290 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a  o a readlock.*/.
112a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63  static int unloc
112b0 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  kReadLock(winFil
112c0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
112d0 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61   res;.  DWORD la
112e0 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69  stErrno;.  if( i
112f0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73  sNT() ){.    res
11300 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
11310 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
11320 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
11330 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
11340 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
11350 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
11360 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d   else{.    res =
11370 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
11380 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
11390 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
113a0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
113b0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
113c0 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  if.  if( res==0 
113d0 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
113e0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
113f0 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f  ))!=ERROR_NOT_LO
11400 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69  CKED) ){.    pFi
11410 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11420 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
11430 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11440 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
11450 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11460 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
11470 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c  unlockReadLock",
11480 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11490 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
114a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
114b0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
114c0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
114d0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
114e0 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
114f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
11500 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
11510 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
11520 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
11530 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
11540 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
11550 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
11560 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
11570 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
11580 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
11590 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
115a0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
115b0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
115c0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
115d0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
115e0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
115f0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
11600 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
11610 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
11620 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
11630 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
11640 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
11650 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
11660 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
11670 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
11680 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
11690 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
116a0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
116b0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
116c0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
116d0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
116e0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
116f0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
11700 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
11710 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
11720 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
11730 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
11740 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
11750 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
11760 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
11770 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
11780 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
11790 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
117a0 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
117b0 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
117c0 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
117d0 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
117e0 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
117f0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
11800 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
11810 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
11820 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
11830 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
11840 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
11850 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
11860 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
11870 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11880 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
11890 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
118a0 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
118b0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
118c0 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
118d0 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
118e0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
118f0 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f   of a Windows lo
11900 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ck call */.  int
11910 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20   newLocktype;   
11920 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65      /* Set pFile
11930 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
11940 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
11950 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
11960 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
11970 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
11980 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
11990 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
119a0 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
119b0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
119c0 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
119d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
119e0 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28  RROR;..  assert(
119f0 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52   id!=0 );.  OSTR
11a00 41 43 45 28 28 22 4c 4f 43 4b 20 25 64 20 25 64  ACE(("LOCK %d %d
11a10 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a   was %d(%d)\n",.
11a20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
11a30 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70  ->h, locktype, p
11a40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
11a50 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
11a60 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  kByte));..  /* I
11a70 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
11a80 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
11a90 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
11aa0 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
11ab0 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
11ac0 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
11ad0 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
11ae0 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
11af0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45  .  ** sqlite3OsE
11b00 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
11b10 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
11b20 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
11b30 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
11b40 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
11b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11b60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
11b70 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
11b80 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
11b90 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
11ba0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
11bb0 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
11bc0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
11bd0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
11be0 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
11bf0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
11c00 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
11c10 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
11c20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
11c30 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
11c40 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
11c50 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
11c60 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
11c70 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
11c80 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
11c90 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
11ca0 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
11cb0 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
11cc0 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
11cd0 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
11ce0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
11cf0 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
11d00 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
11d10 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
11d20 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70  type;.  if(   (p
11d30 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
11d40 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c  NO_LOCK).     ||
11d50 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d   (   (locktype==
11d60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
11d70 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69           && (pFi
11d80 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  le->locktype==RE
11d90 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SERVED_LOCK)).  
11da0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
11db0 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63   3;.    while( c
11dc0 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d  nt-->0 && (res =
11dd0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
11de0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
11df0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
11e30 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
11e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
11e50 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
11e60 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
11e70 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
11e80 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
11e90 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
11ea0 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
11eb0 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
11ec0 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
11ed0 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
11ee0 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
11ef0 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
11f00 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
11f10 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
11f20 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
11f30 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
11f40 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
11f50 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
11f60 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
11f70 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
11f80 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
11f90 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 63       OSTRACE(("c
11fa0 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50  ould not get a P
11fb0 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74  ENDING lock. cnt
11fc0 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20  =%d\n", cnt));. 
11fd0 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73       if( cnt ) s
11fe0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
11ff0 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
12000 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
12010 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
12020 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
12030 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
12040 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
12050 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
12060 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
12070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
12080 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
12090 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
120a0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
120b0 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
120c0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65   );.    res = ge
120d0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
120e0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
120f0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
12100 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
12110 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12120 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
12130 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
12140 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12150 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
12160 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
12170 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
12180 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
12190 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
121a0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
121b0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
121c0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
121d0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
121e0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
121f0 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56  LE_FLAGS, RESERV
12200 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
12210 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
12220 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
12230 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c  ype = RESERVED_L
12240 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
12250 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
12260 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
12270 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
12280 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
12290 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
122a0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
122b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
122c0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
122d0 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
122e0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
122f0 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
12300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
12310 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
12320 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
12330 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
12340 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
12350 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12360 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
12370 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
12380 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52     res = unlockR
12390 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
123a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
123b0 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22  readlock = %d\n"
123c0 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73  , res));.    res
123d0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
123e0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
123f0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
12400 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
12410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12420 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
12430 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
12440 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
12450 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
12460 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
12470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
12480 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
12490 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
124a0 20 4f 53 54 52 41 43 45 28 28 22 65 72 72 6f 72   OSTRACE(("error
124b0 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 6c  -code = %d\n", l
124c0 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20  astErrno));.    
124d0 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46    getReadLock(pF
124e0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
124f0 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
12500 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
12510 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
12520 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
12530 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
12540 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
12550 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
12560 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
12570 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
12580 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
12590 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
125a0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
125b0 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
125c0 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
125d0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
125e0 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
125f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
12600 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
12610 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
12620 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
12630 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
12640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
12660 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41  STRACE(("LOCK FA
12670 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66  ILED %d trying f
12680 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64  or %d but got %d
12690 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
126a0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
126b0 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
126c0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  );.    pFile->la
126d0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
126e0 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rno;.    rc = SQ
126f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
12700 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12710 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
12720 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
12730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
12740 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
12750 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
12760 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
12770 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
12780 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
12790 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
127a0 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
127b0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
127c0 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
127d0 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
127e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
127f0 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
12800 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
12810 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
12820 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Out){.  int rc;.
12830 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
12840 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
12850 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
12860 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12870 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
12880 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
12890 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
128a0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
128b0 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
128c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
128d0 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
128e0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
128f0 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
12900 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12910 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
12920 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
12930 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
12940 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
12950 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  GS, RESERVED_BYT
12960 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
12970 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12980 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
12990 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
129a0 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
129b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
129c0 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41  = !rc;.    OSTRA
129d0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
129e0 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29  K %d %d (remote)
129f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
12a00 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  c));.  }.  *pRes
12a10 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  Out = rc;.  retu
12a20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12a30 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
12a40 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12a50 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
12a60 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
12a70 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
12a80 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
12a90 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
12aa0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12ab0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12ac0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12ad0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
12ae0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
12af0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12b00 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12b10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12b20 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
12b30 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
12b40 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
12b50 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
12b60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12b70 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
12b80 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12b90 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
12ba0 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
12bb0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
12bc0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
12bd0 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
12be0 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
12bf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12c00 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
12c10 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
12c20 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12c30 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
12c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12c50 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
12c60 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
12c70 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
12c80 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
12c90 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
12ca0 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25  d to %d was %d(%
12cb0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
12cc0 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
12cd0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
12ce0 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
12cf0 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20  redLockByte));. 
12d00 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c   type = pFile->l
12d10 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74  ocktype;.  if( t
12d20 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype>=EXCLUSIVE_L
12d30 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
12d40 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
12d50 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
12d60 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
12d70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f  , 0);.    if( lo
12d80 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
12d90 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c  OCK && !getReadL
12da0 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ock(pFile) ){.  
12db0 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75      /* This shou
12dc0 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e  ld never happen.
12dd0 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61    We should alwa
12de0 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20  ys be able to.  
12df0 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65      ** reacquire
12e00 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a   the read lock *
12e10 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  /.      rc = win
12e20 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
12e30 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73  IOERR_UNLOCK, os
12e40 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
12e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12e60 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c  winUnlock", pFil
12e70 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
12e80 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
12e90 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
12ea0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
12eb0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52  ile(&pFile->h, R
12ec0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
12ed0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   1, 0);.  }.  if
12ee0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ( locktype==NO_L
12ef0 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41  OCK && type>=SHA
12f00 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
12f10 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  unlockReadLock(p
12f20 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
12f30 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c   type>=PENDING_L
12f40 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
12f50 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
12f60 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
12f70 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
12f80 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
12f90 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
12fa0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12fb0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
12fc0 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20   is inititially 
12fd0 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
12fe0 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
12ff0 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
13000 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
13010 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
13020 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
13030 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
13040 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
13050 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
13060 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
13070 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
13080 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
13090 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
130a0 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28  void winModeBit(
130b0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
130c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
130d0 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
130e0 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
130f0 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
13100 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
13110 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
13120 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
13130 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
13140 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
13150 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
13160 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
13170 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
13180 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20  ../*.** Control 
13190 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65  and query of the
131a0 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
131b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
131c0 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28   winFileControl(
131d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
131e0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
131f0 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65  pArg){.  winFile
13200 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
13210 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68  le*)id;.  switch
13220 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
13230 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
13240 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
13250 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
13260 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
13270 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13280 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
13290 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41    case SQLITE_LA
132a0 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20  ST_ERRNO: {.    
132b0 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
132c0 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74  (int)pFile->last
132d0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74  Errno;.      ret
132e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
132f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
13300 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
13310 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
13320 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
13330 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
13340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13350 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
13360 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
13370 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
13380 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
13390 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
133a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
133b0 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20  64 oldSz;.      
133c0 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69    int rc = winFi
133d0 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53  leSize(id, &oldS
133e0 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
133f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13400 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13410 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d  e3_int64 newSz =
13420 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   *(sqlite3_int64
13430 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20  *)pArg;.        
13440 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53    if( newSz>oldS
13450 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
13460 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13470 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
13480 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54         rc = winT
13490 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53  runcate(id, newS
134a0 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
134b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
134c0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
134d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
134e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
134f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
13500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13510 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
13520 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
13530 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
13540 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
13550 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
13560 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
13570 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
13580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13590 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
135a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
135b0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
135c0 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
135d0 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
135e0 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
135f0 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
13600 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13610 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
13620 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
13630 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61  E: {.      *(cha
13640 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
13650 65 33 5f 6d 70 72 69 6e 74 66 28 22 77 69 6e 33  e3_mprintf("win3
13660 32 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  2");.      retur
13670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
13680 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
13690 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
136a0 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20  V_RETRY: {.     
136b0 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29   int *a = (int*)
136c0 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  pArg;.      if( 
136d0 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20  a[0]>0 ){.      
136e0 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72    win32IoerrRetr
136f0 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  y = a[0];.      
13700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
13710 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72  [0] = win32Ioerr
13720 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Retry;.      }. 
13730 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20       if( a[1]>0 
13740 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32  ){.        win32
13750 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
13760 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65  = a[1];.      }e
13770 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31  lse{.        a[1
13780 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65  ] = win32IoerrRe
13790 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20  tryDelay;.      
137a0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
137b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
137c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
137d0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
137e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
137f0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
13800 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
13810 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
13820 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
13830 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
13840 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
13850 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
13860 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
13870 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
13880 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
13890 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
138a0 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
138b0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
138c0 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
138d0 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
138e0 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
138f0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
13900 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
13910 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
13920 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
13930 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
13940 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
13950 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
13960 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
13970 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
13980 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
13990 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28  3_file *id){.  (
139a0 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72  void)id;.  retur
139b0 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
139c0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
139d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
139e0 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
139f0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
13a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a10 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
13a20 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
13a30 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69  _file *id){.  wi
13a40 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46  nFile *p = (winF
13a50 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72  ile*)id;.  retur
13a60 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  n SQLITE_IOCAP_U
13a70 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
13a80 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20  OPEN |.         
13a90 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ((p->ctrlFlags &
13aa0 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53   WINFILE_PSOW)?S
13ab0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
13ac0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
13ad0 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
13ae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
13af0 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  /* .** Windows w
13b00 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
13b10 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
13b20 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
13b30 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
13b40 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
13b50 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
13b60 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
13b70 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
13b80 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
13b90 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
13ba0 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
13bb0 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53  SYSTEM_INFO winS
13bc0 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ysInfo;../*.** H
13bd0 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
13be0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
13bf0 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
13c00 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
13c10 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
13c20 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
13c30 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
13c40 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
13c50 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c  y .** this file,
13c60 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
13c70 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d  y be shared by m
13c80 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
13c90 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
13ca0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
13cb0 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
13cc0 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
13cd0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
13ce0 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
13cf0 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
13d00 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
13d10 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
13d20 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
13d30 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
13d40 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
13d50 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
13d60 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
13d70 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
13d80 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
13d90 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
13da0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
13db0 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
13dc0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
13dd0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
13de0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
13df0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
13e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
13e10 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
13e20 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
13e30 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
13e40 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13e50 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13e60 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
13e70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
13e80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
13e90 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
13ea0 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
13eb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13ec0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
13ed0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
13ee0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
13ef0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13f00 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
13f10 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
13f20 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
13f30 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
13f40 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
13f50 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
13f60 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
13f70 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
13f80 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
13f90 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
13fa0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
13fb0 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
13fc0 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
13fd0 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
13fe0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
13ff0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
14000 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
14010 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
14020 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
14030 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
14040 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
14050 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
14060 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
14070 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
14080 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
14090 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
140a0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
140b0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
140c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
140d0 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
140e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
140f0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
14100 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
14110 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
14120 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
14130 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
14140 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
14150 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
14160 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
14170 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
14180 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
14190 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
141a0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
141b0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
141c0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
141d0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
141e0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
141f0 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
14200 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
14210 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
14220 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
14230 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
14240 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
14250 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
14260 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
14270 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
14280 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
14290 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
142a0 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
142b0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
142d0 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
142e0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
142f0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14310 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
14320 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
14330 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
14340 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
14350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14360 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
14370 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
14380 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
14390 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
143a0 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
143b0 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
143c0 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
143d0 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
143e0 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
143f0 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
14420 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
14430 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
14440 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
14450 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14460 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
14470 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
14480 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
14490 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
144a0 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
144b0 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
144c0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
144d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
144e0 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68  EBUG.  u8 nextSh
144f0 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
14500 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
14510 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
14520 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
14530 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
14540 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
14550 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
14560 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
14570 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
14580 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
14590 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
145a0 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
145b0 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
145c0 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
145d0 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
145e0 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
145f0 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
14600 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
14610 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
14620 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
14630 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
14640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
14650 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
14660 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
14670 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
14680 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
14690 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
146a0 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
146b0 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
146c0 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
146d0 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
146e0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
146f0 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
14700 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
14710 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
14720 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
14730 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
14740 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
14750 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
14760 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
14770 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
14780 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
14790 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
147a0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
147b0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
147c0 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
147d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
147e0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
147f0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
14800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14810 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
14820 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
14830 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
14840 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
14850 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
14860 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
14870 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14890 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
148a0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
148b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
148c0 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
148f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
14900 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  its winShmNode *
14910 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
14920 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
14930 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
14940 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
14950 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
14960 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
14970 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73  )        /* firs
14980 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
14990 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44  define WIN_SHM_D
149a0 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42  MS    (WIN_SHM_B
149b0 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
149c0 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
149d0 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
149e0 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72  ** Apply advisor
149f0 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
14a00 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  n bytes beginnin
14a10 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64  g at ofst..*/.#d
14a20 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b  efine _SHM_UNLCK
14a30 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    1.#define _SHM
14a40 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e  _RDLCK  2.#defin
14a50 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a  e _SHM_WRLCK  3.
14a60 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
14a70 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77  mSystemLock(.  w
14a80 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65  inShmNode *pFile
14a90 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ,    /* Apply lo
14aa0 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
14ab0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
14ac0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
14ad0 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
14ae0 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c    /* _SHM_UNLCK,
14af0 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20   _SHM_RDLCK, or 
14b00 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  _SHM_WRLCK */.  
14b10 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
14b20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
14b30 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
14b40 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
14b50 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
14b60 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
14b70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
14b80 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
14b90 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ock */.){.  int 
14ba0 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
14bb0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
14bc0 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63   form Lock/Unloc
14bd0 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20  kFileEx() */..  
14be0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
14bf0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
14c00 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
14c10 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
14c20 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
14c30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14c40 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
14c50 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
14c60 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f  ;..  /* Release/
14c70 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74  Acquire the syst
14c80 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f  em-level lock */
14c90 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  .  if( lockType=
14ca0 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20  =_SHM_UNLCK ){. 
14cb0 20 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63     rc = winUnloc
14cc0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
14cd0 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20  ile.h, ofst, 0, 
14ce0 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  nByte, 0);.  }el
14cf0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  se{.    /* Initi
14d00 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
14d10 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
14d20 20 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67      DWORD dwFlag
14d30 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  s = LOCKFILE_FAI
14d40 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20  L_IMMEDIATELY;. 
14d50 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20     if( lockType 
14d60 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20  == _SHM_WRLCK ) 
14d70 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46  dwFlags |= LOCKF
14d80 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
14d90 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  CK;.    rc = win
14da0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
14db0 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67  >hFile.h, dwFlag
14dc0 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  s, ofst, 0, nByt
14dd0 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  e, 0);.  }.  .  
14de0 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20  if( rc!= 0 ){.  
14df0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14e00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14e10 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
14e20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  =  osGetLastErro
14e30 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r();.    rc = SQ
14e40 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
14e50 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
14e60 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20 30 78  LOCK %d %s %s 0x
14e70 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20  %08lx\n", .     
14e80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
14e90 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
14ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
14eb0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
14ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
14ed0 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
14ee0 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45  K ? "UnlockFileE
14ef0 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78  x" : "LockFileEx
14f00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
14f10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 29  ile->lastErrno))
14f20 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
14f30 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
14f40 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
14f50 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69  methods */.stati
14f60 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71  c int winOpen(sq
14f70 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74  lite3_vfs*,const
14f80 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66   char*,sqlite3_f
14f90 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a  ile*,int,int*);.
14fa0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
14fb0 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
14fc0 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69   *,const char*,i
14fd0 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67  nt);../*.** Purg
14fe0 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  e the winShmNode
14ff0 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
15000 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69   entries with wi
15010 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
15020 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
15030 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
15040 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
15050 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
15060 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
15070 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
15080 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
15090 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
150a0 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69  winShmPurge(sqli
150b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
150c0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a  nt deleteFlag){.
150d0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70    winShmNode **p
150e0 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  p;.  winShmNode 
150f0 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a  *p;.  BOOL bRc;.
15100 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
15110 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
15120 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64   pp = &winShmNod
15130 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
15140 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a  (p = *pp)!=0 ){.
15150 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
15160 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
15170 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  i;.      if( p->
15180 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f  mutex ) sqlite3_
15190 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
151a0 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tex);.      for(
151b0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
151c0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
151d0 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69   bRc = osUnmapVi
151e0 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67  ewOfFile(p->aReg
151f0 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20  ion[i].pMap);.  
15200 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
15210 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64  SHM-PURGE pid-%d
15220 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64   unmap region=%d
15230 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
15240 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
15250 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15260 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20  sId(), i,.      
15270 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f             bRc ?
15280 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
15290 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20  ));.        bRc 
152a0 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
152b0 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d  p->aRegion[i].hM
152c0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
152d0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
152e0 20 70 69 64 2d 25 64 20 63 6c 6f 73 65 20 72 65   pid-%d close re
152f0 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  gion=%d %s\n",. 
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
15320 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
15330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15340 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22    bRc ? "ok" : "
15350 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
15360 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
15370 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56 41 4c  hFile.h != INVAL
15380 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
15390 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
153a0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
153b0 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  (1);.        win
153c0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
153d0 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29  ile *)&p->hFile)
153e0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
153f0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
15400 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
15410 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
15420 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
15430 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
15440 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(1);.        sq
15450 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15460 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15470 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
15480 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
15490 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
154a0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
154b0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69  oc();.        Si
154c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
154d0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
154e0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
154f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
15500 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
15510 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
15520 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
15530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
15540 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
15550 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15560 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
15570 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
15580 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
15590 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
155a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
155b0 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
155c0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
155d0 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
155e0 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
155f0 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
15600 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
15610 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
15620 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
15630 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
15640 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
15650 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
15660 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
15670 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
15680 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
15690 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
156a0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
156b0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
156c0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
156d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
156e0 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
156f0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
15700 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
15710 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
15720 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
15730 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
15740 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
15770 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
15780 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
15790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
157a0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
157b0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
157c0 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
157f0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
15800 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
15810 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
15820 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
15830 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
15840 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
15850 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
15860 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
15870 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
15880 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
15890 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
158a0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
158b0 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
158c0 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
158d0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
158e0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
158f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
15900 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ERR_NOMEM;.  mem
15910 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
15920 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d  (*p));.  nName =
15930 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15940 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
15950 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
15960 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
15970 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61  *pShmNode) + nNa
15980 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28  me + 17 );.  if(
15990 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
159a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
159b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
159c0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
159d0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65    }.  memset(pNe
159e0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, 0, sizeof(*pN
159f0 65 77 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37  ew) + nName + 17
15a00 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  );.  pNew->zFile
15a10 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
15a20 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
15a30 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
15a40 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
15a50 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
15a60 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
15a70 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
15a80 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
15a90 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
15aa0 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  e); ..  /* Look 
15ab0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
15ac0 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
15ad0 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
15ae0 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
15af0 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
15b00 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
15b10 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
15b20 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
15b30 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
15b40 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
15b50 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
15b60 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
15b70 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
15b80 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
15b90 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
15ba0 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
15bb0 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
15bc0 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
15bd0 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
15be0 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
15bf0 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
15c00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
15c10 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
15c20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
15c30 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
15c40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
15c50 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
15c60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15c70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
15c80 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
15c90 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
15ca0 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
15cb0 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
15cc0 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
15cd0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
15ce0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
15cf0 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
15d00 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
15d10 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
15d20 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
15d30 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
15d40 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
15d50 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
15d60 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
15d70 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
15d80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15d90 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
15da0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
15db0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
15dc0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
15dd0 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20  n(pDbFd->pVfs,. 
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
15e00 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
15e10 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
15e20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e40 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
15e50 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
15e60 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ,  /* File handl
15e70 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20  e here */.      
15e80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
15e90 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c  E_OPEN_WAL | SQL
15ea0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
15eb0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
15ec0 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f 64 65  _CREATE, /* Mode
15ed0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 20 20   flags */.      
15ee0 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
15ef0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
15f00 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  !=rc ){.      go
15f10 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
15f20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
15f30 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
15f40 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
15f50 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
15f60 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
15f70 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
15f80 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
15f90 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20  to zero length. 
15fa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15fb0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
15fc0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
15fd0 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  WRLCK, WIN_SHM_D
15fe0 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
15ff0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
16000 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
16010 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
16020 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
16030 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16050 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
16060 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16070 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65  RR_SHMOPEN, osGe
16080 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
160a0 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62  winOpenShm", pDb
160b0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
160c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
160d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
160e0 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53  ){.      winShmS
160f0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
16100 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
16110 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
16120 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
16130 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
16140 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
16150 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
16160 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
16170 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
16180 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20  open_err;.  }.. 
16190 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77   /* Make the new
161a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68   connection a ch
161b0 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ild of the winSh
161c0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
161d0 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
161e0 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
161f0 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
16200 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
16210 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
16220 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
16230 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
16240 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65   = p;.  winShmLe
16250 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  aveMutex();..  /
16260 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20  * The reference 
16270 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64  count on pShmNod
16280 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
16290 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75  en incremented u
162a0 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f  nder.  ** the co
162b0 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68  ver of the winSh
162c0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  mEnterMutex() mu
162d0 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
162e0 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
162f0 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69  * new (struct wi
16300 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  nShm) object to 
16310 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
16320 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
16330 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
16340 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
16350 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
16360 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
16370 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
16380 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
16390 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
163a0 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
163b0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
163c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20  mNode->mutex .  
163d0 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
163e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
163f0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
16400 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
16410 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
16420 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
16430 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
16440 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
16450 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
16460 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
16470 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
16480 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
16490 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
164a0 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d  en_err:.  winShm
164b0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
164c0 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
164d0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
164e0 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28  ;.  winShmPurge(
164f0 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b  pDbFd->pVfs, 0);
16500 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
16510 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
16520 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
16530 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16540 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
16550 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53  ee(pNew);.  winS
16560 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
16570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16580 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
16590 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
165a0 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
165b0 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
165c0 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
165d0 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
165e0 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rue..*/.static i
165f0 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a  nt winShmUnmap(.
16600 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16610 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
16620 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
16630 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
16640 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
16650 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ag             /
16660 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63  * Delete after c
16670 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a  losing if true *
16680 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
16690 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20  pDbFd;       /* 
166a0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
166b0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
166c0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  /.  winShm *p;  
166d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
166e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
166f0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69  e closed */.  wi
16700 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
16710 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  de; /* The under
16720 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
16730 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  ory file */.  wi
16740 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20  nShm **pp;      
16750 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
16760 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
16770 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a  connections */..
16780 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
16790 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
167a0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
167b0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
167c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
167d0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
167e0 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  de;..  /* Remove
167f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72   connection p fr
16800 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  om the set of co
16810 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  nnections associ
16820 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70  ated.  ** with p
16830 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ShmNode */.  sql
16840 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16850 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
16860 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68  );.  for(pp=&pSh
16870 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28  mNode->pFirst; (
16880 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28  *pp)!=p; pp = &(
16890 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  *pp)->pNext){}. 
168a0 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
168b0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
168c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a  connection p */.
168d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
168e0 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  );.  pDbFd->pShm
168f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
16900 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
16910 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  Node->mutex);.. 
16920 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d   /* If pShmNode-
16930 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65  >nRef has reache
16940 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  d 0, then close 
16950 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20  the underlying. 
16960 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   ** shared-memor
16970 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20  y file, too */. 
16980 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
16990 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
169a0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
169b0 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
169c0 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
169d0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
169e0 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67  {.    winShmPurg
169f0 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64  e(pDbFd->pVfs, d
16a00 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a  eleteFlag);.  }.
16a10 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
16a20 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
16a30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16a40 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
16a50 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
16a60 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
16a70 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  gment..*/.static
16a80 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28   int winShmLock(
16a90 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16aa0 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
16ab0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
16ac0 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
16ad0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
16ae0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
16af0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
16b00 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
16b10 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
16b20 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b40 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
16b50 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
16b60 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
16b70 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
16b80 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
16b90 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
16ba0 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  k */.){.  winFil
16bb0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
16bc0 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20  ile*)fd;        
16bd0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
16be0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
16bf0 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
16c00 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
16c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16c20 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
16c30 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
16c40 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58   */.  winShm *pX
16c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16c70 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
16c80 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
16c90 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
16ca0 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
16cb0 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
16cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ce0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
16cf0 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d10 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
16d20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
16d30 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
16d40 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
16d50 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
16d60 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
16d70 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
16d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
16d90 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
16da0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
16db0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
16dc0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
16dd0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
16de0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
16df0 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
16e00 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
16e10 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
16e20 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
16e30 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
16e40 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
16e50 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
16e60 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
16e70 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
16e80 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
16e90 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
16ea0 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31  );..  mask = (u1
16eb0 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29  6)((1U<<(ofst+n)
16ec0 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b  ) - (1U<<ofst));
16ed0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
16ee0 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
16ef0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
16f00 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
16f10 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
16f20 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
16f30 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
16f40 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
16f50 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
16f60 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
16f70 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
16f80 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
16f90 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
16fa0 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
16fb0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
16fc0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
16fd0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
16fe0 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
16ff0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
17000 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
17010 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
17020 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
17030 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
17040 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
17050 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
17060 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
17070 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
17080 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
17090 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
170a0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
170b0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
170c0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
170d0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_UNLCK, ofst+
170e0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
170f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17100 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
17110 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
17120 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20   Undo the local 
17130 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
17140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17150 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d  {.      p->exclM
17160 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
17170 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
17180 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
17190 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  } .  }else if( f
171a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
171b0 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  M_SHARED ){.    
171c0 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  u16 allShared = 
171d0 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20  0;  /* Union of 
171e0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
171f0 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20  nnections other 
17200 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20  than "p" */..   
17210 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69   /* Find out whi
17220 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  ch shared locks 
17230 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64  are already held
17240 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   by sibling conn
17250 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  ections..    ** 
17260 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61  If any sibling a
17270 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20  lready holds an 
17280 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
17290 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74  go ahead and ret
172a0 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54  urn.    ** SQLIT
172b0 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20  E_BUSY..    */. 
172c0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
172d0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
172e0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
172f0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
17300 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
17310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
17320 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
17330 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17340 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53      }.      allS
17350 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61  hared |= pX->sha
17360 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
17370 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65      /* Get share
17380 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  d locks at the s
17390 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20  ystem level, if 
173a0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20  necessary */.   
173b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
173c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
173d0 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73  (allShared & mas
173e0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
173f0 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
17400 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
17410 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73   _SHM_RDLCK, ofs
17420 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
17430 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
17440 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
17450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
17460 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
17470 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
17480 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
17490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
174a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
174b0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
174c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
174d0 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
174e0 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
174f0 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
17500 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
17510 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
17520 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
17530 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
17540 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
17550 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
17560 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
17570 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
17580 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
17590 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
175a0 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
175b0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
175c0 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
175d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
175e0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
175f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17600 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65    }.  .    /* Ge
17610 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
17620 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
17630 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e  tem level.  Then
17640 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20   if successful. 
17650 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20     ** also mark 
17660 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  the local connec
17670 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f  tion as being lo
17680 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cked..    */.   
17690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
176a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
176b0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
176c0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
176d0 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _WRLCK, ofst+WIN
176e0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
176f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17710 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
17720 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
17730 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
17740 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
17750 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
17760 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
17770 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
17780 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
17790 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
177a0 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64  CK shmid-%d, pid
177b0 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33  -%d got %03x,%03
177c0 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  x %s\n",.       
177d0 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29      p->id, (int)
177e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
177f0 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68 61 72  essId(), p->shar
17800 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
17810 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
17820 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
17830 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
17840 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
17850 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
17860 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
17870 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
17880 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
17890 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
178a0 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
178b0 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
178c0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
178d0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
178e0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
178f0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
17900 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
17910 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
17920 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
17930 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
17940 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
17950 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
17960 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
17970 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
17980 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72  ;.  /* MemoryBar
17990 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20  rier(); // does 
179a0 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e  not work -- do n
179b0 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20  ot know why not 
179c0 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
179d0 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68  Mutex();.  winSh
179e0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
179f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
17a00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
17a10 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
17a20 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
17a30 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
17a40 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
17a50 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
17a60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17a70 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
17a80 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
17a90 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
17aa0 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
17ab0 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
17ac0 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
17ad0 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
17ae0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
17af0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
17b00 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
17b10 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
17b20 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
17b30 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
17b40 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
17b50 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
17b60 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
17b70 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
17b80 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
17b90 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
17ba0 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
17bb0 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
17bc0 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
17bd0 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
17be0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
17bf0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
17c00 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
17c10 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
17c20 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
17c30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
17c40 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
17c50 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
17c60 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
17c70 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
17c80 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
17c90 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
17ca0 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
17cb0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
17cc0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
17cd0 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
17ce0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
17cf0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
17d00 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
17d10 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
17d20 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
17d30 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
17d40 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
17d50 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
17d60 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
17d70 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
17d80 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
17d90 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
17da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17db0 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
17dc0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
17dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
17de0 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
17df0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
17e00 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
17e30 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
17e40 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
17e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
17e60 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
17e70 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
17ea0 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
17eb0 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
17ec0 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17ee0 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
17ef0 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
17f00 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
17f10 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
17f20 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
17f30 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
17f40 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
17f50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17f60 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
17f70 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
17f80 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
17f90 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
17fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
17fb0 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70  rn rc;.    p = p
17fc0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
17fd0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
17fe0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
17ff0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18000 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
18010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
18020 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
18030 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
18040 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
18050 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
18060 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
18070 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
18080 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
18090 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
180a0 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
180b0 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
180c0 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
180d0 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
180e0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
180f0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
18100 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
18110 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
18120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
18130 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
18140 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
18150 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
18160 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
18170 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
18180 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
18190 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
181a0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
181b0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
181c0 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
181d0 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
181e0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
181f0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
18200 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
18210 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
18220 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
18230 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
18240 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
18250 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
18260 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
18270 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
18280 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
18290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
182a0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
182b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
182c0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
182d0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
182f0 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46  inShmMap1", pDbF
18300 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
18310 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
18320 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
18330 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20  ( sz<nByte ){.  
18340 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
18350 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
18360 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
18370 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73  t. If isWrite is
18380 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a   set to.      **
18390 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c   zero, exit earl
183a0 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
183b0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
183c0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
183d0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
183e0 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
183f0 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69  ly, if isWrite i
18400 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20  s non-zero, use 
18410 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
18420 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a  llocate.      **
18430 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
18440 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
18450 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
18460 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f   !isWrite ) goto
18470 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
18480 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
18490 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
184a0 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
184b0 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20  hFile, nByte);. 
184c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
184d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
184e0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
184f0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
18500 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
18510 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
18520 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
18530 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
18540 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
18550 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
18560 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
18570 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
18580 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
18590 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
185a0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
185b0 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
185c0 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
185d0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
185e0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
185f0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
18600 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  ->aRegion, (iReg
18610 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70  ion+1)*sizeof(ap
18620 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20  New[0]).    );. 
18630 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
18640 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18650 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
18660 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
18670 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
18680 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
18690 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
186a0 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
186b0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
186c0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
186d0 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20  DLE hMap;       
186e0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
186f0 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
18700 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
18710 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
18720 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
18730 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
18740 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45       .#if SQLITE
18750 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
18760 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
18770 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
18780 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  p(pShmNode->hFil
18790 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
187a0 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
187b0 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  ITE, nByte, NULL
187c0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  .      );.#else.
187d0 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43        hMap = osC
187e0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
187f0 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  W(pShmNode->hFil
18800 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
18810 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
18820 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
18830 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
18840 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41  ndif.      OSTRA
18850 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64  CE(("SHM-MAP pid
18860 2d 25 64 20 63 72 65 61 74 65 20 72 65 67 69 6f  -%d create regio
18870 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73  n=%d nbyte=%d %s
18880 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
18890 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75      (int)osGetCu
188a0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
188b0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
188c0 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ion, nByte,.    
188d0 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20             hMap 
188e0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
188f0 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  "));.      if( h
18900 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Map ){.        i
18910 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68  nt iOffset = pSh
18920 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
18930 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20  zRegion;.       
18940 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
18950 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
18960 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
18970 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
18980 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
18990 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d  WINRT.        pM
189a0 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
189b0 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70  FileFromApp(hMap
189c0 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
189d0 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
189e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f  ,.            iO
189f0 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
18a00 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
18a10 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
18a20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20        );.#else. 
18a30 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73         pMap = os
18a40 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d  MapViewOfFile(hM
18a50 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
18a60 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
18a70 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
18a80 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66  0, iOffset - iOf
18a90 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
18aa0 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
18ab0 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
18ac0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54  ndif.        OST
18ad0 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70  RACE(("SHM-MAP p
18ae0 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69 6f 6e  id-%d map region
18af0 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20 73 69  =%d offset=%d si
18b00 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  ze=%d %s\n",.   
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
18b20 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50  nt)osGetCurrentP
18b30 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
18b40 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
18b50 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20  Offset,.        
18b60 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f           szRegio
18b70 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a  n, pMap ? "ok" :
18b80 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
18b90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
18ba0 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
18bb0 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
18bc0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
18bd0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
18be0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
18bf0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
18c00 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  MMAP, pShmNode->
18c10 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
18c20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
18c30 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d  ShmMap3", pDbFd-
18c40 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
18c50 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c   if( hMap ) osCl
18c60 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b  oseHandle(hMap);
18c70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
18c80 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
18c90 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   }..      pShmNo
18ca0 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
18cb0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70  Node->nRegion].p
18cc0 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20  Map = pMap;.    
18cd0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
18ce0 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
18cf0 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d  egion].hMap = hM
18d00 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
18d10 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
18d20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
18d30 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
18d40 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
18d50 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e  Region ){.    in
18d60 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67  t iOffset = iReg
18d70 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
18d80 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
18d90 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
18da0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
18db0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
18dc0 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  y;.    char *p =
18dd0 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64   (char *)pShmNod
18de0 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69  e->aRegion[iRegi
18df0 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70  on].pMap;.    *p
18e00 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69  p = (void *)&p[i
18e10 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20  OffsetShift];.  
18e20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
18e30 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
18e40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
18e50 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
18e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18e70 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
18e80 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  inShmMap     0.#
18e90 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f   define winShmLo
18ea0 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
18eb0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30   winShmBarrier 0
18ec0 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
18ed0 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
18ee0 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
18ef0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
18f00 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
18f10 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
18f20 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
18f30 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
18f40 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
18f60 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
18f70 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
18f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f90 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fe0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  */../*.** This v
18ff0 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
19000 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
19010 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
19020 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
19030 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a  file for win32..
19040 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
19050 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
19060 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d  ds winIoMethod =
19070 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20   {.  2,         
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19090 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
190a0 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20   */.  winClose, 
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
190d0 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20  */.  winRead,   
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190f0 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
19100 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20  .  winWrite,    
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
19130 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20    winTruncate,  
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
19160 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20  /.  winSync,    
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
19190 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20    winFileSize,  
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
191c0 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20  /.  winLock,    
191d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191e0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
191f0 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20    winUnlock,    
19200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19210 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
19220 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76    winCheckReserv
19230 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
19240 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
19250 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  vedLock */.  win
19260 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
19270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19280 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
19290 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192b0 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
192c0 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43   */.  winDeviceC
192d0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
192e0 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
192f0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
19300 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20  */.  winShmMap, 
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
19330 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c  */.  winShmLock,
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
19360 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
19370 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
19380 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
19390 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
193a0 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20 20  Unmap           
193b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
193c0 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  mUnmap */.};../*
193d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
19420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19430 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
19440 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
19450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19460 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
19470 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
19480 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
19490 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
194a0 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
194b0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
194c0 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  t..*/../*.** Con
194d0 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
194e0 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
194f0 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
19500 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
19510 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
19520 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
19530 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
19540 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
19550 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
19560 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
19570 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
19580 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
19590 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
195a0 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69  d *convertUtf8Fi
195b0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
195c0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
195d0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
195e0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e  d = 0;.  if( isN
195f0 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
19600 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e  erted = utf8ToUn
19610 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
19620 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
19630 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
19640 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
19650 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
19660 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
19670 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
19680 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
19690 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
196a0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
196b0 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
196c0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
196d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
196e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
196f0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
19700 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
19710 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61  ugh to.** hold a
19720 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
19730 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  me characters..*
19740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
19750 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
19760 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
19770 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
19780 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
19790 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
197a0 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
197b0 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
197c0 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
197d0 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73  0123456789";.  s
197e0 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e  ize_t i, j;.  in
197f0 74 20 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20 63  t nTempPath;.  c
19800 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41  har zTempPath[MA
19810 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20 2f 2a  X_PATH+2];..  /*
19820 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
19830 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
19840 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
19850 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
19860 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
19870 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
19880 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
19890 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
198a0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
198b0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
198c0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
198d0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
198e0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
198f0 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50 61    memset(zTempPa
19900 74 68 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b  th, 0, MAX_PATH+
19910 32 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  2);..  if( sqlit
19920 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
19930 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
19940 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
19950 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
19960 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
19970 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
19980 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45  .  }.#if !SQLITE
19990 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65 6c 73 65  _OS_WINRT.  else
199a0 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
199b0 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b     char *zMulti;
199c0 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69 64 65  .    WCHAR zWide
199d0 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
199e0 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74      osGetTempPat
199f0 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hW(MAX_PATH-30, 
19a00 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
19a10 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65  zMulti = unicode
19a20 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
19a30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
19a40 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
19a50 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
19a60 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
19a70 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69  th, "%s", zMulti
19a80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19a90 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20  _free(zMulti);. 
19aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19ab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19ac0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
19ad0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
19ae0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
19af0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
19b00 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63  ar *zUtf8;.    c
19b10 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41  har zMbcsPath[MA
19b20 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47  X_PATH];.    osG
19b30 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f  etTempPathA(MAX_
19b40 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61  PATH-30, zMbcsPa
19b50 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d  th);.    zUtf8 =
19b60 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
19b70 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63  bcs_to_utf8(zMbc
19b80 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  sPath);.    if( 
19b90 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73  zUtf8 ){.      s
19ba0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
19bb0 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
19bc0 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55  mpPath, "%s", zU
19bd0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
19be0 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
19bf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19c00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19c10 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
19c20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65   }.  }.#endif.#e
19c30 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
19c40 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
19c50 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
19c60 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
19c70 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
19c80 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
19c90 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
19ca0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
19cb0 2a 2f 0a 20 20 6e 54 65 6d 70 50 61 74 68 20 3d  */.  nTempPath =
19cc0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
19cd0 28 7a 54 65 6d 70 50 61 74 68 29 3b 0a 0a 20 20  (zTempPath);..  
19ce0 69 66 28 20 28 6e 54 65 6d 70 50 61 74 68 20 2b  if( (nTempPath +
19cf0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
19d00 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
19d10 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20  E_PREFIX) + 18) 
19d20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  >= nBuf ){.    r
19d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
19d40 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  OR;.  }..  for(i
19d50 3d 6e 54 65 6d 70 50 61 74 68 3b 20 69 3e 30 20  =nTempPath; i>0 
19d60 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31  && zTempPath[i-1
19d70 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a  ]=='\\'; i--){}.
19d80 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d    zTempPath[i] =
19d90 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73   0;..  sqlite3_s
19da0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c  nprintf(nBuf-18,
19db0 20 7a 42 75 66 2c 20 28 6e 54 65 6d 70 50 61 74   zBuf, (nTempPat
19dc0 68 20 3e 20 30 29 20 3f 0a 20 20 20 20 20 20 20  h > 0) ?.       
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d  "%s\\"SQLITE_TEM
19df0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 20 3a 20  P_FILE_PREFIX : 
19e00 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
19e10 5f 50 52 45 46 49 58 2c 0a 20 20 20 20 20 20 20  _PREFIX,.       
19e20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
19e30 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71  pPath);.  j = sq
19e40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
19e50 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
19e60 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
19e70 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
19e80 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
19e90 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
19ea0 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
19eb0 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
19ec0 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
19ed0 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
19ee0 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
19ef0 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  0;.  zBuf[j+1] =
19f00 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   0;..  OSTRACE((
19f10 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20  "TEMP FILENAME: 
19f20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20  %s\n", zBuf));. 
19f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19f40 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  K; .}../*.** Ret
19f50 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
19f60 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65  named file is re
19f70 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
19f80 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
19f90 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  if.** it is some
19fa0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
19fb0 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72   a directory, or
19fc0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
19fd0 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a   kind of memory.
19fe0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
19ff0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1a000 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
1a010 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  nst void *zConve
1a020 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61  rted){.  DWORD a
1a030 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
1a040 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
1a050 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 69 73 4e  rrno;..  if( isN
1a060 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
1a070 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
1a080 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
1a090 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
1a0a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
1a0b0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
1a0c0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
1a0d0 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
1a0e0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1a0f0 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
1a100 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
1a130 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
1a140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
1a160 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65  AttrData)) && re
1a170 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1a180 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
1a190 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
1a1a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1a1b0 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a   Invalid name? *
1a1c0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72  /.    }.    attr
1a1d0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
1a1e0 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23  ileAttributes;.#
1a1f0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1a200 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
1a210 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
1a220 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
1a230 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
1a240 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
1a250 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e  return (attr!=IN
1a260 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1a270 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26  BUTES) && (attr&
1a280 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1a290 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a  IRECTORY);.}../*
1a2a0 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
1a2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1a2c0 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  inOpen(.  sqlite
1a2d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1a2e0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
1a2f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1a300 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
1a310 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1a320 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
1a330 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1a340 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
1a350 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
1a360 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
1a370 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a390 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
1a3a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
1a3b0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1a3c0 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
1a3d0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
1a3e0 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
1a3f0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57   lastErrno;.  DW
1a400 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63  ORD dwDesiredAcc
1a410 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53  ess;.  DWORD dwS
1a420 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52  hareMode;.  DWOR
1a430 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70  D dwCreationDisp
1a440 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  osition;.  DWORD
1a450 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1a460 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53  butes = 0;.#if S
1a470 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1a480 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b   int isTemp = 0;
1a490 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
1a4a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
1a4b0 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20  ile*)id;.  void 
1a4c0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20  *zConverted;    
1a4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a4e0 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f  ename in OS enco
1a4f0 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ding */.  const 
1a500 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20  char *zUtf8Name 
1a510 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65  = zName; /* File
1a520 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e  name in UTF-8 en
1a530 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
1a540 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
1a550 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
1a560 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
1a570 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
1a580 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
1a590 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
1a5a0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
1a5b0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
1a5c0 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
1a5d0 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
1a5e0 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
1a5f0 5f 50 41 54 48 2b 32 5d 3b 20 20 20 20 20 2f 2a  _PATH+2];     /*
1a600 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
1a610 63 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65  create temp file
1a620 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72  name */..  int r
1a630 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1a640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
1a650 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64  ction Return Cod
1a660 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  e */.#if !define
1a670 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c  d(NDEBUG) || SQL
1a680 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
1a690 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
1a6a0 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
1a6b0 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
1a6c0 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a   open */.#endif.
1a6d0 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
1a6e0 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
1a6f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1a700 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
1a710 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
1a720 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1a730 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
1a740 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
1a750 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
1a760 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1a770 45 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  E);.#ifndef NDEB
1a780 55 47 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  UG.  int isReado
1a790 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
1a7a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1a7b0 44 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20  DONLY);.#endif. 
1a7c0 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65   int isReadWrite
1a7d0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1a7e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1a7f0 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  TE);..#ifndef ND
1a800 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65  EBUG.  int isOpe
1a810 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72  nJournal = (isCr
1a820 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
1a830 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
1a840 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1a850 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
1a860 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1a870 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
1a880 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1a890 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
1a8a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
1a8b0 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
1a8c0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
1a8d0 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
1a8e0 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
1a8f0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
1a900 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
1a910 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
1a920 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
1a930 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
1a940 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
1a950 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
1a960 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
1a970 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
1a980 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
1a990 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
1a9a0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
1a9b0 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
1a9c0 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
1a9d0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
1a9e0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
1a9f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
1aa00 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
1aa10 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
1aa20 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
1aa30 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
1aa40 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
1aa50 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
1aa60 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
1aa70 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
1aa80 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
1aa90 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
1aaa0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
1aab0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
1aac0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
1aad0 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
1aae0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
1aaf0 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
1ab00 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
1ab10 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
1ab20 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
1ab30 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
1ab40 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
1ab50 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
1ab60 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1ab70 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
1ab80 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
1ab90 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
1aba0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1abb0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
1abc0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
1abd0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
1abe0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1abf0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1ac00 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
1ac10 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
1ac20 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
1ac30 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
1ac40 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1ac50 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
1ac60 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
1ac70 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
1ac80 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
1ac90 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
1aca0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1acb0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1acc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1acd0 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
1ace0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1acf0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
1ad00 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1ad10 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
1ad20 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
1ad30 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1ad40 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
1ad50 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1ad60 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1ad70 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
1ad80 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1ad90 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
1ada0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1adb0 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61  EN_WAL.  );..  a
1adc0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
1add0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ade0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 70 46 69  ER(pVfs);..  pFi
1adf0 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  le->h = INVALID_
1ae00 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20  HANDLE_VALUE;.. 
1ae10 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e   /* If the secon
1ae20 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
1ae30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  is function is N
1ae40 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ULL, generate a 
1ae50 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
1ae60 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
1ae70 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55   .  */.  if( !zU
1ae80 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
1ae90 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
1aea0 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
1aeb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54  );.    rc = getT
1aec0 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
1aed0 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  +2, zTmpname);. 
1aee0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1af00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1af10 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a     zUtf8Name = z
1af20 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
1af30 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1af40 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
1af50 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
1af60 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
1af70 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20  .  ** URIs with 
1af80 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e  parameters.  Hen
1af90 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77  ce, they can alw
1afa0 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e  ays be passed in
1afb0 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
1afc0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
1afd0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1afe0 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f  (eType!=SQLITE_O
1aff0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20  PEN_MAIN_DB) || 
1b000 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1b010 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20  OPEN_URI) ||.   
1b020 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73       zUtf8Name[s
1b030 74 72 6c 65 6e 28 7a 55 74 66 38 4e 61 6d 65 29  trlen(zUtf8Name)
1b040 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  +1]==0 );..  /* 
1b050 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65  Convert the file
1b060 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74  name to the syst
1b070 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a  em encoding. */.
1b080 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
1b090 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
1b0a0 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  me(zUtf8Name);. 
1b0b0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
1b0c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1b0d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1b0e0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  MEM;.  }..  if( 
1b0f0 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
1b100 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ted) ){.    sqli
1b110 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1b120 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ted);.    return
1b130 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1b140 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ISDIR;.  }..  i
1b150 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
1b160 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
1b170 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
1b180 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
1b190 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RITE;.  }else{. 
1b1a0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1b1b0 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
1b1c0 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c  D;.  }..  /* SQL
1b1d0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1b1e0 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  VE is used to ma
1b1f0 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e  ke sure that a n
1b200 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  ew file is .  **
1b210 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65   created. SQLite
1b220 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20   doesn't use it 
1b230 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78 63  to indicate "exc
1b240 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 20 0a  lusive access" .
1b250 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73    ** as it is us
1b260 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64  ually understood
1b270 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45  ..  */.  if( isE
1b280 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
1b290 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77  /* Creates a new
1b2a0 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
1b2b0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
1b2c0 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  dy exist. */.   
1b2d0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1b2e0 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73  exists, it fails
1b2f0 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
1b300 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
1b310 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d   CREATE_NEW;.  }
1b320 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61 74  else if( isCreat
1b330 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
1b340 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20   existing file, 
1b350 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20  or create if it 
1b360 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f  doesn't exist */
1b370 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
1b380 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
1b390 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73  N_ALWAYS;.  }els
1b3a0 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20  e{.    /* Opens 
1b3b0 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  a file, only if 
1b3c0 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  it exists. */.  
1b3d0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1b3e0 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45  osition = OPEN_E
1b3f0 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20  XISTING;.  }..  
1b400 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49  dwShareMode = FI
1b410 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
1b420 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
1b430 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  ;..  if( isDelet
1b440 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  e ){.#if SQLITE_
1b450 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46  OS_WINCE.    dwF
1b460 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1b470 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
1b480 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69  TE_HIDDEN;.    i
1b490 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65  sTemp = 1;.#else
1b4a0 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
1b4b0 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
1b4c0 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f  _ATTRIBUTE_TEMPO
1b4d0 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  RARY.           
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49      | FILE_ATTRI
1b500 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20  BUTE_HIDDEN.    
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
1b530 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e  E_FLAG_DELETE_ON
1b540 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20  _CLOSE;.#endif. 
1b550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c   }else{.    dwFl
1b560 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
1b570 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
1b580 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  E_NORMAL;.  }.  
1b590 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20  /* Reports from 
1b5a0 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65  the internet are
1b5b0 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63   that performanc
1b5c0 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a  e is always.  **
1b5d0 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f   better if FILE_
1b5e0 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
1b5f0 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63  SS is used.  Tic
1b600 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69  ket #2699. */.#i
1b610 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1b620 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74  E.  dwFlagsAndAt
1b630 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45  tributes |= FILE
1b640 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
1b650 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ESS;.#endif..  i
1b660 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66  f( isNT() ){.#if
1b670 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1b680 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32  .    CREATEFILE2
1b690 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
1b6a0 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72  TERS extendedPar
1b6b0 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74  ameters;.    ext
1b6c0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
1b6d0 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  dwSize = sizeof(
1b6e0 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
1b6f0 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
1b700 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1b710 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41  rameters.dwFileA
1b720 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20  ttributes =.    
1b730 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
1b740 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
1b750 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
1b760 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
1b770 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
1b780 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73  eFlags = dwFlags
1b790 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
1b7a0 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a  FILE_FLAG_MASK;.
1b7b0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
1b7c0 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74  meters.dwSecurit
1b7d0 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55  yQosFlags = SECU
1b7e0 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a  RITY_ANONYMOUS;.
1b7f0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
1b800 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74  meters.lpSecurit
1b810 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55  yAttributes = NU
1b820 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  LL;.    extended
1b830 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70  Parameters.hTemp
1b840 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  lateFile = NULL;
1b850 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
1b860 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28   osCreateFile2((
1b870 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1b880 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
1b8b0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
1b900 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
1b910 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b930 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65   &extendedParame
1b940 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  ters))==INVALID_
1b950 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1b980 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1b990 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b9b0 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
1b9c0 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28  lse.    while( (
1b9d0 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
1b9e0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1b9f0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
1ba20 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
1ba50 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
1ba80 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baa0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
1bab0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
1bae0 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
1baf0 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72              retr
1bb20 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
1bb30 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
1bb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
1bb50 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  op */.    }.#end
1bb60 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
1bb70 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1bb80 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
1bb90 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
1bba0 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54  eateFileA((LPCST
1bbb0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
1bbe0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
1bc10 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
1bc40 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
1bc50 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1bc80 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
1bcb0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1bcc0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63     retryIoerr(&c
1bcf0 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1bd00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1bd10 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
1bd20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
1bd30 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a  logIoerr(cnt);..
1bd40 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
1bd50 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c   %d %s 0x%lx %s\
1bd60 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
1bd70 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69  h, zName, dwDesi
1bd80 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20  redAccess, .    
1bd90 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49         h==INVALI
1bda0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f  D_HANDLE_VALUE ?
1bdb0 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
1bdc0 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ));..  if( h==IN
1bdd0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1bde0 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  UE ){.    pFile-
1bdf0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
1be00 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
1be10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
1be20 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e  ANTOPEN, pFile->
1be30 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f  lastErrno, "winO
1be40 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  pen", zUtf8Name)
1be50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1be60 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1be70 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
1be80 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
1be90 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ive ){.      ret
1bea0 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73  urn winOpen(pVfs
1beb0 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20  , zName, id, .  
1bec0 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61             ((fla
1bed0 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs|SQLITE_OPEN_R
1bee0 45 41 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54  EADONLY)&~(SQLIT
1bef0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
1bf00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1bf10 49 54 45 29 29 2c 20 70 4f 75 74 46 6c 61 67 73  ITE)), pOutFlags
1bf20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1bf30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bf40 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
1bf50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1bf60 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
1bf70 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
1bf80 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75  te ){.      *pOu
1bf90 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
1bfa0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a  OPEN_READWRITE;.
1bfb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bfc0 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
1bfd0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1bfe0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LY;.    }.  }.. 
1bff0 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
1c000 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29  , sizeof(*pFile)
1c010 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
1c020 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
1c030 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  od;.  pFile->h =
1c040 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73   h;.  pFile->las
1c050 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
1c060 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73  R;.  pFile->pVfs
1c070 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65   = pVfs;.  pFile
1c080 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70 46  ->pShm = 0;.  pF
1c090 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61  ile->zPath = zNa
1c0a0 6d 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  me;.  if( sqlite
1c0b0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e  3_uri_boolean(zN
1c0c0 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c  ame, "psow", SQL
1c0d0 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  ITE_POWERSAFE_OV
1c0e0 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  ERWRITE) ){.    
1c0f0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1c100 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57   |= WINFILE_PSOW
1c110 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
1c120 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28  E_OS_WINCE.  if(
1c130 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
1c140 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1c150 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20  EN_MAIN_DB.     
1c160 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74    && !winceCreat
1c170 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
1c180 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43  le).  ){.    osC
1c190 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20  loseHandle(h);. 
1c1a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c1b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1c1c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1c1d0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
1c1e0 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
1c1f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65  {.    pFile->zDe
1c200 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43  leteOnClose = zC
1c210 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73  onverted;.  }els
1c220 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1c230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1c240 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a  onverted);.  }..
1c250 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
1c260 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c270 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1c280 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a  the named file..
1c290 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1c2a0 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74  Windows does not
1c2b0 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f   allow a file to
1c2c0 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73   be deleted if s
1c2d0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
1c2e0 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e  cess has it open
1c2f0 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76  .  Sometimes a v
1c300 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20  irus scanner or 
1c310 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d  indexing program
1c320 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20  .** will open a 
1c330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f  journal file sho
1c340 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73  rtly after it is
1c350 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65   created in orde
1c360 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65  r to do.** whate
1c370 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68  ver it does.  Wh
1c380 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70  ile this other p
1c390 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1c3a0 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70  g the.** file op
1c3b0 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75  en, we will be u
1c3c0 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  nable to delete 
1c3d0 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  it.  To work aro
1c3e0 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62  und this.** prob
1c3f0 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30  lem, we delay 10
1c400 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
1c410 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65  nd try to delete
1c420 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74   again.  Up.** t
1c430 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  o MX_DELETION_AT
1c440 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20  TEMPTs deletion 
1c450 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e  attempts are run
1c460 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a   before giving.*
1c470 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  * up and returni
1c480 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
1c490 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
1c4a0 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lete(.  sqlite3_
1c4b0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1c4c0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
1c4d0 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
1c4e0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1c4f0 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ame,      /* Nam
1c500 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
1c510 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ete */.  int syn
1c520 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20  cDir            
1c530 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
1c540 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a   on win32 */.){.
1c550 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1c560 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44   int rc;.  DWORD
1c570 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c   attr;.  DWORD l
1c580 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64  astErrno;.  void
1c590 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
1c5a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c5b0 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
1c5c0 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
1c5d0 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
1c5e0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
1c5f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
1c600 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  TE);.  zConverte
1c610 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1c620 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
1c630 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
1c640 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
1c650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1c660 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
1c670 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
1c680 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54    do {.#if SQLIT
1c690 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1c6a0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
1c6b0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
1c6c0 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73  Data;.      mems
1c6d0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
1c6e0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
1c6f0 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ta));.      if (
1c700 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1c710 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74  utesExW(zConvert
1c720 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66  ed, GetFileExInf
1c730 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
1c760 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ttrData) ){.    
1c770 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
1c780 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
1c790 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c  butes;.      }el
1c7a0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1c7b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 41   SQLITE_OK; /* A
1c7c0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
1c7d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c7e0 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
1c7f0 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
1c800 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a  ileAttributesW(z
1c810 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
1c820 69 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74  if.      if ( at
1c830 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr==INVALID_FILE
1c840 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20  _ATTRIBUTES ){. 
1c850 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c860 54 45 5f 4f 4b 3b 20 2f 2a 20 41 6c 72 65 61 64  TE_OK; /* Alread
1c870 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
1c880 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c890 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  }.      if ( att
1c8a0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
1c8b0 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20  _DIRECTORY ){.  
1c8c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c8d0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65  E_ERROR; /* File
1c8e0 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  s only. */.     
1c8f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c900 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44  }.      if ( osD
1c910 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76  eleteFileW(zConv
1c920 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
1c930 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c940 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e  ; /* Deleted OK.
1c950 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1c960 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c970 20 69 66 20 28 20 21 72 65 74 72 79 49 6f 65 72   if ( !retryIoer
1c980 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
1c990 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  no) ){.        r
1c9a0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1c9b0 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74  ; /* No more ret
1c9c0 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ries. */.       
1c9d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c9e0 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a      } while(1);.
1c9f0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1ca00 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1ca10 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20  .  else{.    do 
1ca20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f  {.      attr = o
1ca30 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1ca40 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  esA(zConverted);
1ca50 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
1ca60 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  ==INVALID_FILE_A
1ca70 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20  TTRIBUTES ){.   
1ca80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ca90 5f 4f 4b 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  _OK; /* Already 
1caa0 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
1cab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1cac0 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
1cad0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1cae0 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
1caf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cb00 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
1cb10 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
1cb20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1cb30 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
1cb40 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
1cb50 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
1cb60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1cb70 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
1cb80 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
1cb90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cba0 66 20 28 20 21 72 65 74 72 79 49 6f 65 72 72 28  f ( !retryIoerr(
1cbb0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1cbc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1cbd0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
1cbe0 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
1cbf0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
1cc00 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1cc10 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
1cc20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
1cc30 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  c ){.    rc = wi
1cc40 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1cc50 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c  _IOERR_DELETE, l
1cc60 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1cc70 20 20 20 20 20 20 20 22 77 69 6e 44 65 6c 65 74         "winDelet
1cc80 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  e", zFilename);.
1cc90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67    }else{.    log
1cca0 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a  Ioerr(cnt);.  }.
1ccb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1ccc0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53  Converted);.  OS
1ccd0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c  TRACE(("DELETE \
1cce0 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69  "%s\" %s\n", zFi
1ccf0 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f 20 22 66  lename, (rc ? "f
1cd00 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 20 29 29  ailed" : "ok" ))
1cd10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cd20 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
1cd30 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64  he existance and
1cd40 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c   status of a fil
1cd50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1cd60 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
1cd70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1cd80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
1cd90 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
1cda0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1cdb0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
1cdc0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
1cdd0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
1cde0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1cdf0 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
1ce00 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
1ce10 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
1ce20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1ce40 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b  UT: Result */.){
1ce50 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
1ce60 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
1ce70 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
1ce80 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1ce90 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
1cea0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
1ceb0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1cec0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1ced0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
1cee0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
1cef0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
1cf00 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
1cf10 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
1cf20 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1cf30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1cf40 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
1cf50 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  isNT() ){.    in
1cf60 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
1cf70 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
1cf80 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
1cf90 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
1cfa0 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
1cfb0 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
1cfc0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
1cfd0 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  c = osGetFileAtt
1cfe0 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57  ributesExW((LPCW
1cff0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
1d020 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
1d030 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rd, .           
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d050 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
1d060 26 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e  & retryIoerr(&cn
1d070 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
1d080 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  {}.    if( rc ){
1d090 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  .      /* For an
1d0a0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1d0b0 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65  XISTS query, tre
1d0c0 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  at a zero-length
1d0d0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
1d0e0 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
1d0f0 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
1d100 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c  .      if(    fl
1d110 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
1d120 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20  SS_EXISTS.      
1d130 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
1d140 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d  .nFileSizeHigh==
1d150 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
1d160 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
1d170 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  izeLow==0 ){.   
1d180 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
1d190 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1d1a0 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TES;.      }else
1d1b0 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
1d1c0 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
1d1d0 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
1d1e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1d1f0 20 20 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63        logIoerr(c
1d200 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  nt);.      if( l
1d210 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f  astErrno!=ERROR_
1d220 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  FILE_NOT_FOUND )
1d230 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67  {.        winLog
1d240 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1d250 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45  RR_ACCESS, lastE
1d260 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73  rrno, "winAccess
1d270 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1d280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1d290 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1d2a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d2b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
1d2c0 45 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ESS;.      }else
1d2d0 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
1d2e0 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
1d2f0 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
1d300 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
1d310 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1d320 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1d330 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
1d340 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
1d350 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
1d360 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
1d370 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1d380 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
1d390 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
1d3a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1d3b0 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
1d3c0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
1d3d0 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
1d3e0 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
1d3f0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1d400 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  TES;.      break
1d410 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1d420 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
1d430 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TE:.      rc = a
1d440 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
1d450 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74               (at
1d470 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  tr & FILE_ATTRIB
1d480 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30  UTE_READONLY)==0
1d490 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d4a0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1d4b0 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
1d4c0 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
1d4d0 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
1d4e0 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  Out = rc;.  retu
1d4f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d500 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
1d510 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
1d520 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
1d530 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ame should be us
1d540 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66  ed verbatim.  If
1d550 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** non-zero is 
1d560 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
1d570 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
1d580 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1d590 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a  n must simply.**
1d5a0 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65   use the provide
1d5b0 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62  d path name verb
1d5c0 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76  atim -OR- resolv
1d5d0 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c  e it into a full
1d5e0 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73   path name.** us
1d5f0 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50  ing the GetFullP
1d600 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50  athName Win32 AP
1d610 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61  I function (if a
1d620 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74  vailable)..*/.st
1d630 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56  atic BOOL winIsV
1d640 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
1d650 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d660 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a  Pathname.){.  /*
1d670 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
1d680 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
1d690 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61  th a forward sla
1d6a0 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73  sh or a backslas
1d6b0 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a  h, it is either.
1d6c0 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43    ** a legal UNC
1d6d0 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20   name, a volume 
1d6e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f  relative path, o
1d6f0 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
1d700 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20  th name in the. 
1d710 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61   ** "Unix" forma
1d720 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54  t on Windows.  T
1d730 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20  here is no easy 
1d740 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74  way to different
1d750 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a  iate between.  *
1d760 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20  * the final two 
1d770 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65  cases; therefore
1d780 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20  , we return the 
1d790 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c  safer return val
1d7a0 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20  ue of TRUE.  ** 
1d7b0 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20  so that callers 
1d7c0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1d7d0 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65   will simply use
1d7e0 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20   it verbatim..  
1d7f0 2a 2f 0a 20 20 69 66 20 28 20 7a 50 61 74 68 6e  */.  if ( zPathn
1d800 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a  ame[0]=='/' || z
1d810 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c  Pathname[0]=='\\
1d820 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' ){.    return 
1d830 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  TRUE;.  }..  /*.
1d840 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
1d850 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
1d860 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61  h a letter and a
1d870 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74   colon it is eit
1d880 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a  her a volume.  *
1d890 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  * relative path 
1d8a0 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
1d8b0 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66  ath.  Callers of
1d8c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
1d8d0 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74  ust not.  ** att
1d8e0 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74  empt to treat it
1d8f0 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70   as a relative p
1d900 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74  ath name (i.e. t
1d910 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c  hey should simpl
1d920 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65  y use.  ** it ve
1d930 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20  rbatim)..  */.  
1d940 69 66 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c  if ( sqlite3Isal
1d950 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  pha(zPathname[0]
1d960 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31  ) && zPathname[1
1d970 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72 65  ]==':' ){.    re
1d980 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a  turn TRUE;.  }..
1d990 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    /*.  ** If we 
1d9a0 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  get to this poin
1d9b0 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  t, the path name
1d9c0 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63   should almost c
1d9d0 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75  ertainly be a pu
1d9e0 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69  rely.  ** relati
1d9f0 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74  ve one (i.e. not
1da00 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74   a UNC name, not
1da10 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e   absolute, and n
1da20 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69  ot volume relati
1da30 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ve)..  */.  retu
1da40 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a  rn FALSE;.}../*.
1da50 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
1da60 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
1da70 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
1da80 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c  .  Write the ful
1da90 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e  l.** pathname in
1daa0 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74  to zOut[].  zOut
1dab0 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65  [] will be at le
1dac0 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ast pVfs->mxPath
1dad0 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e  name.** bytes in
1dae0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
1daf0 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68   int winFullPath
1db00 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
1db10 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1db20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1db30 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
1db40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1db50 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20  zRelative,      
1db60 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
1db70 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
1db80 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c  h */.  int nFull
1db90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dba0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1dbb0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
1dbc0 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
1dbd0 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20   *zFull         
1dbe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
1dbf0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
1dc00 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
1dc10 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69  __CYGWIN__).  Si
1dc20 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1dc30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1dc40 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  OR );.  UNUSED_P
1dc50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b  ARAMETER(nFull);
1dc60 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
1dc70 3e 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 4d 41 58  >mxPathname>=MAX
1dc80 5f 50 41 54 48 20 29 3b 0a 20 20 61 73 73 65 72  _PATH );.  asser
1dc90 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e  t( nFull>=pVfs->
1dca0 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
1dcb0 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
1dcc0 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
1dcd0 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
1dce0 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
1dcf0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
1dd00 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
1dd10 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
1dd20 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
1dd30 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
1dd40 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
1dd50 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
1dd60 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
1dd70 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
1dd80 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
1dd90 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
1dda0 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
1ddb0 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
1ddc0 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
1ddd0 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
1dde0 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
1ddf0 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61  ectory and a sla
1de00 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  sh..    */.    c
1de10 68 61 72 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54  har zOut[MAX_PAT
1de20 48 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  H+1];.    memset
1de30 28 7a 4f 75 74 2c 20 30 2c 20 4d 41 58 5f 50 41  (zOut, 0, MAX_PA
1de40 54 48 2b 31 29 3b 0a 20 20 20 20 63 79 67 77 69  TH+1);.    cygwi
1de50 6e 5f 63 6f 6e 76 5f 74 6f 5f 77 69 6e 33 32 5f  n_conv_to_win32_
1de60 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20  path(zRelative, 
1de70 7a 4f 75 74 29 3b 20 2f 2a 20 50 4f 53 49 58 20  zOut); /* POSIX 
1de80 74 6f 20 57 69 6e 33 32 20 2a 2f 0a 20 20 20 20  to Win32 */.    
1de90 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1dea0 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
1deb0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
1dec0 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a  Full, "%s\\%s",.
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
1def0 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 4f 75  a_directory, zOu
1df00 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
1df10 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
1df20 20 54 68 65 20 43 79 67 77 69 6e 20 64 6f 63 73   The Cygwin docs
1df30 20 73 74 61 74 65 20 74 68 61 74 20 74 68 65 20   state that the 
1df40 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6e  maximum length n
1df50 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  eeded.    **    
1df60 20 20 20 66 6f 72 20 74 68 65 20 62 75 66 66 65     for the buffe
1df70 72 20 70 61 73 73 65 64 20 74 6f 20 63 79 67 77  r passed to cygw
1df80 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f  in_conv_to_full_
1df90 77 69 6e 33 32 5f 70 61 74 68 0a 20 20 20 20 2a  win32_path.    *
1dfa0 2a 20 20 20 20 20 20 20 69 73 20 4d 41 58 5f 50  *       is MAX_P
1dfb0 41 54 48 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ATH..    */.    
1dfc0 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66  cygwin_conv_to_f
1dfd0 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a  ull_win32_path(z
1dfe0 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29  Relative, zFull)
1dff0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1e000 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
1e010 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53  ..#if (SQLITE_OS
1e020 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45  _WINCE || SQLITE
1e030 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64  _OS_WINRT) && !d
1e040 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
1e050 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
1e060 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1e070 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f  ITE_ERROR );.  /
1e080 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
1e090 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
1e0a0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
1e0b0 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
1e0c0 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61  */.  /* WinRT ha
1e0d0 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76  s no way to conv
1e0e0 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70  ert a relative p
1e0f0 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ath to an absolu
1e100 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20  te one. */.  if 
1e110 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
1e120 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
1e130 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
1e140 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
1e150 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
1e160 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
1e170 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
1e180 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
1e190 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
1e1a0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
1e1b0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
1e1c0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
1e1d0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
1e1e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
1e1f0 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
1e200 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
1e210 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
1e220 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
1e230 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
1e240 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
1e250 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
1e260 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
1e270 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1e280 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
1e290 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
1e2a0 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a  Full, "%s\\%s",.
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
1e2d0 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65  a_directory, zRe
1e2e0 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65  lative);.  }else
1e2f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
1e300 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
1e310 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
1e320 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
1e330 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
1e340 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e350 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
1e360 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
1e370 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
1e380 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
1e390 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
1e3a0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f   int nByte;.  vo
1e3b0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
1e3c0 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20    char *zOut;.. 
1e3d0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68   /* If this path
1e3e0 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
1e3f0 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22  h "/X:", where "
1e400 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62  X" is any alphab
1e410 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63  etic.  ** charac
1e420 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65  ter, discard the
1e430 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f   initial "/" fro
1e440 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a  m the pathname..
1e450 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61    */.  if( zRela
1e460 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  tive[0]=='/' && 
1e470 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
1e480 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20  Relative[1]) && 
1e490 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a  zRelative[2]==':
1e4a0 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69  ' ){.    zRelati
1e4b0 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ve++;.  }..  /* 
1e4c0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
1e4d0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
1e4e0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
1e4f0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
1e500 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
1e510 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
1e520 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
1e530 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
1e540 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
1e550 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
1e560 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
1e570 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
1e580 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
1e590 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
1e5a0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
1e5b0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
1e5c0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
1e5d0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1e5e0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  ITE_ERROR );.  i
1e5f0 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
1e600 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
1e610 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
1e620 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
1e630 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
1e640 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
1e650 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
1e660 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
1e670 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
1e680 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
1e690 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
1e6a0 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
1e6b0 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
1e6c0 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
1e6d0 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
1e6e0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
1e6f0 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
1e700 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
1e710 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
1e720 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
1e730 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b  ctory and a back
1e740 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
1e750 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1e760 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
1e770 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
1e780 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22   zFull, "%s\\%s"
1e790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e7a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
1e7b0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a  ata_directory, z
1e7c0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72  Relative);.    r
1e7d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e7e0 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65  .  }.  zConverte
1e7f0 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
1e800 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  ilename(zRelativ
1e810 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
1e820 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
1e830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e840 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
1e850 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
1e860 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a    LPWSTR zTemp;.
1e870 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
1e880 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
1e890 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1e8a0 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33  ed, 0, 0, 0) + 3
1e8b0 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
1e8c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
1e8d0 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
1e8e0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
1e8f0 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
1e900 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1e910 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1e920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e930 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1e940 20 7d 0a 20 20 20 20 6f 73 47 65 74 46 75 6c 6c   }.    osGetFull
1e950 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
1e960 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
1e970 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
1e980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1e990 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1e9a0 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64     zOut = unicod
1e9b0 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
1e9c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e9d0 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66  (zTemp);.  }.#if
1e9e0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1e9f0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
1ea00 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
1ea10 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
1ea20 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
1ea30 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
1ea40 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20  ted, 0, 0, 0) + 
1ea50 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
1ea60 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
1ea70 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
1ea80 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
1ea90 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
1eaa0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1eab0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1eac0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ead0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1eae0 20 20 7d 0a 20 20 20 20 6f 73 47 65 74 46 75 6c    }.    osGetFul
1eaf0 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
1eb00 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  *)zConverted, nB
1eb10 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
1eb20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1eb30 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1eb40 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
1eb50 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
1eb60 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
1eb70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
1eb80 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  mp);.  }.#endif.
1eb90 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20    if( zOut ){.  
1eba0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1ebb0 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
1ebc0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
1ebd0 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f   zFull, "%s", zO
1ebe0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
1ebf0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
1ec00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ec10 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
1ec20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ec30 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ERR_NOMEM;.  }.#
1ec40 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66  endif.}..#ifndef
1ec50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
1ec60 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
1ec70 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
1ec80 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
1ec90 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
1eca0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
1ecb0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
1ecc0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
1ecd0 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
1ece0 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
1ecf0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
1ed00 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
1ed10 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
1ed20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
1ed30 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
1ed40 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
1ed50 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
1ed60 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
1ed70 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1ed80 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c  d *winDlOpen(sql
1ed90 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1eda0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1edb0 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45  ename){.  HANDLE
1edc0 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   h;.  void *zCon
1edd0 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
1ede0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
1edf0 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45  lename);.  UNUSE
1ee00 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1ee10 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
1ee20 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
1ee30 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
1ee40 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  ( isNT() ){.#if 
1ee50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1ee60 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61      h = osLoadPa
1ee70 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c  ckagedLibrary((L
1ee80 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1ee90 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  d, 0);.#else.   
1eea0 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61   h = osLoadLibra
1eeb0 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ryW((LPCWSTR)zCo
1eec0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
1eed0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
1eee0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1eef0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20  I.  else{.    h 
1ef00 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41  = osLoadLibraryA
1ef10 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
1ef20 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
1ef30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1ef40 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65  Converted);.  re
1ef50 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d  turn (void*)h;.}
1ef60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1ef70 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
1ef80 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
1ef90 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
1efa0 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
1efb0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
1efc0 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
1efd0 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
1efe0 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  ), nBuf, zBufOut
1eff0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1f000 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69   (*winDlSym(sqli
1f010 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
1f020 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f  oid *pHandle, co
1f030 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f  nst char *zSymbo
1f040 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55  l))(void){.  UNU
1f050 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1f060 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  fs);.  return (v
1f070 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47  oid(*)(void))osG
1f080 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28  etProcAddressA((
1f090 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20  HANDLE)pHandle, 
1f0a0 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74  zSymbol);.}.stat
1f0b0 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  ic void winDlClo
1f0c0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
1f0d0 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
1f0e0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
1f0f0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1f100 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28    osFreeLibrary(
1f110 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
1f120 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
1f130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1f140 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
1f150 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
1f160 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30  ine winDlOpen  0
1f170 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
1f180 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
1f190 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20  e winDlSym   0. 
1f1a0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c   #define winDlCl
1f1b0 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ose 0.#endif.../
1f1c0 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
1f1d0 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
1f1e0 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
1f1f0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
1f200 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
1f210 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1f220 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
1f230 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74  ar *zBuf){.  int
1f240 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44   n = 0;.  UNUSED
1f250 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1f260 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1f270 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d  LITE_TEST).  n =
1f280 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28   nBuf;.  memset(
1f290 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
1f2a0 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
1f2b0 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d  of(SYSTEMTIME)<=
1f2c0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59  nBuf-n ){.    SY
1f2d0 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20  STEMTIME x;.    
1f2e0 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
1f2f0 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &x);.    memcpy(
1f300 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69  &zBuf[n], &x, si
1f310 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20  zeof(x));.    n 
1f320 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20  += sizeof(x);.  
1f330 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
1f340 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
1f350 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d  .    DWORD pid =
1f360 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f370 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65  cessId();.    me
1f380 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
1f390 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
1f3a0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
1f3b0 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66  of(pid);.  }.#if
1f3c0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1f3d0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c  .  if( sizeof(UL
1f3e0 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e  ONGLONG)<=nBuf-n
1f3f0 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e   ){.    ULONGLON
1f400 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  G cnt = osGetTic
1f410 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20  kCount64();.    
1f420 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
1f430 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
1f440 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
1f450 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
1f460 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
1f470 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
1f480 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e   ){.    DWORD cn
1f490 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
1f4a0 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  nt();.    memcpy
1f4b0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c  (&zBuf[n], &cnt,
1f4c0 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20   sizeof(cnt));. 
1f4d0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63     n += sizeof(c
1f4e0 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  nt);.  }.#endif.
1f4f0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52    if( sizeof(LAR
1f500 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75  GE_INTEGER)<=nBu
1f510 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45  f-n ){.    LARGE
1f520 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20  _INTEGER i;.    
1f530 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  osQueryPerforman
1f540 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20  ceCounter(&i);. 
1f550 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
1f560 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69  n], &i, sizeof(i
1f570 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
1f580 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64  eof(i);.  }.#end
1f590 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  if.  return n;.}
1f5a0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
1f5b0 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
1f5c0 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
1f5d0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
1f5e0 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
1f5f0 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69  nt winSleep(sqli
1f600 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1f610 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20  nt microsec){.  
1f620 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
1f630 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  eep((microsec+99
1f640 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53  9)/1000);.  UNUS
1f650 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1f660 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d  s);.  return ((m
1f670 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
1f680 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  0)*1000;.}../*.*
1f690 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1f6a0 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
1f6b0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
1f6c0 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
1f6d0 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
1f6e0 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
1f6f0 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
1f700 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
1f710 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
1f720 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
1f730 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
1f740 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
1f750 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
1f760 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
1f770 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
1f780 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
1f790 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
1f7a0 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
1f7b0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
1f7c0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
1f7d0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
1f7e0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
1f7f0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
1f800 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
1f810 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
1f820 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
1f830 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
1f840 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
1f850 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
1f860 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
1f870 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
1f880 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
1f890 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
1f8a0 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
1f8b0 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
1f8c0 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
1f8d0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
1f8e0 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
1f8f0 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
1f900 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
1f910 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
1f920 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
1f930 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
1f940 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
1f950 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
1f960 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
1f970 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
1f980 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
1f990 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74  vfs *pVfs, sqlit
1f9a0 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
1f9b0 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20  {.  /* FILETIME 
1f9c0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36  structure is a 6
1f9d0 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72  4-bit value repr
1f9e0 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d  esenting the num
1f9f0 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30  ber of .     100
1fa00 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
1fa10 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
1fa20 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
1fa30 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20  D 2305813.5). . 
1fa40 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66   */.  FILETIME f
1fa50 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  t;.  static cons
1fa60 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
1fa70 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
1fa80 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c   = 23058135*(sql
1fa90 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
1faa0 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  00;.#ifdef SQLIT
1fab0 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20  E_TEST.  static 
1fac0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
1fad0 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20  t64 unixEpoch = 
1fae0 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65  24405875*(sqlite
1faf0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
1fb00 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33  .#endif.  /* 2^3
1fb10 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65  2 - to avoid use
1fb20 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69   of LL and warni
1fb30 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20  ngs in gcc */.  
1fb40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1fb50 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32  ite3_int64 max32
1fb60 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20  BitValue = .    
1fb70 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
1fb80 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
1fb90 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
1fba0 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74  0000000 + (sqlit
1fbb0 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32  e3_int64)2949672
1fbc0 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  96;..#if SQLITE_
1fbd0 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45  OS_WINCE.  SYSTE
1fbe0 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73  MTIME time;.  os
1fbf0 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74  GetSystemTime(&t
1fc00 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79  ime);.  /* if Sy
1fc10 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
1fc20 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72  me() fails, it r
1fc30 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eturns zero. */.
1fc40 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54    if (!osSystemT
1fc50 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74  imeToFileTime(&t
1fc60 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72  ime,&ft)){.    r
1fc70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1fc80 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  OR;.  }.#else.  
1fc90 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
1fca0 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29  sFileTime( &ft )
1fcb0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e  ;.#endif..  *piN
1fcc0 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65  ow = winFiletime
1fcd0 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20  Epoch +.        
1fce0 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f      ((((sqlite3_
1fcf0 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44  int64)ft.dwHighD
1fd00 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69  ateTime)*max32Bi
1fd10 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20  tValue) + .     
1fd20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1fd30 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
1fd40 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
1fd50 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b  te3_int64)10000;
1fd60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1fd70 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
1fd80 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
1fd90 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
1fda0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
1fdb0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
1fdc0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
1fdd0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
1fde0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1fdf0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
1fe00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fe10 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
1fe20 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
1fe30 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
1fe40 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
1fe50 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
1fe60 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
1fe70 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
1fe80 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
1fe90 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
1fea0 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
1feb0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
1fec0 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
1fed0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
1fee0 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
1fef0 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
1ff00 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
1ff10 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
1ff20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1ff30 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
1ff40 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
1ff50 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
1ff60 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
1ff70 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
1ff80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ff90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
1ffa0 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
1ffb0 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
1ffc0 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
1ffd0 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
1ffe0 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
1fff0 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
20000 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  Windows (or errn
20010 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
20020 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20  r_r() on Unix). 
20030 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
20040 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
20050 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
20060 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
20070 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
20080 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
20090 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
200a0 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
200b0 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
200c0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
200d0 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
200e0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
200f0 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
20100 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
20110 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
20120 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
20130 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
20140 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
20150 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
20160 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
20170 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
20180 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
20190 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
201a0 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
201b0 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
201c0 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
201d0 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
201e0 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
201f0 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
20200 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
20210 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
20220 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
20230 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
20240 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
20250 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
20260 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
20270 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
20280 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
20290 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
202a0 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
202b0 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
202c0 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
202d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
202e0 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
202f0 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
20300 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
20310 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
20320 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
20330 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
20340 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
20350 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
20360 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
20370 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
20380 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
20390 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
203a0 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
203b0 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
203c0 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
203d0 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
203e0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
203f0 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
20400 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
20410 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
20420 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
20430 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
20440 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
20450 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
20460 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
20470 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
20480 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
20490 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
204a0 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
204b0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
204c0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
204d0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
204e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
204f0 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
20500 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  n getLastErrorMs
20510 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
20520 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b  (), nBuf, zBuf);
20530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
20540 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
20550 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
20560 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
20570 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
20580 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
20590 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
205a0 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
205b0 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
205d0 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
205e0 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
205f0 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
20600 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48   */.    MAX_PATH
20610 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
20620 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
20630 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
20640 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
20650 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
20660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
20670 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
206a0 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
206b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
206c0 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
206d0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
206e0 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
206f0 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
20700 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
20710 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
20720 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
20730 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
20740 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
20750 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
20760 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
20770 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
20780 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
20790 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
207a0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
207b0 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
207c0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
207d0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
207e0 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
207f0 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
20800 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
20810 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
20820 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
20830 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
20840 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
20850 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
20860 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
20870 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
20880 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
20890 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
208a0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
208b0 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
208c0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
208d0 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
208e0 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
208f0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
20900 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xGetSystemCall
20910 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53   */.    winNextS
20920 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20  ystemCall,   /* 
20930 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
20940 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f  */.  };..  /* Do
20950 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20  uble-check that 
20960 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61  the aSyscall[] a
20970 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f  rray has been co
20980 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63  nstructed.  ** c
20990 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74  orrectly.  See t
209a0 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39  icket [bb3a86e89
209b0 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61  0c8e96ab] */.  a
209c0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
209d0 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 33 20 29  (aSyscall)==73 )
209e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
209f0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20  E_OMIT_WAL.  /* 
20a00 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61  get memory map a
20a10 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c  llocation granul
20a20 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  arity */.  memse
20a30 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30  t(&winSysInfo, 0
20a40 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f  , sizeof(SYSTEM_
20a50 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49  INFO));.#if SQLI
20a60 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73  TE_OS_WINRT.  os
20a70 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
20a80 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
20a90 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  ;.#else.  osGetS
20aa0 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
20ab0 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  sInfo);.#endif. 
20ac0 20 61 73 73 65 72 74 28 77 69 6e 53 79 73 49 6e   assert(winSysIn
20ad0 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
20ae0 72 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29 3b  ranularity > 0);
20af0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
20b00 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
20b10 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72  &winVfs, 1);.  r
20b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20b30 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
20b40 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
20b50 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
20b60 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f  NRT.  if( sleepO
20b70 62 6a 20 21 3d 20 4e 55 4c 4c 20 29 7b 0a 20 20  bj != NULL ){.  
20b80 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
20b90 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73  sleepObj);.    s
20ba0 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
20bb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
20bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20bd0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
20be0 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.