Integrate patch from Neal Norwitz.  He writes:

"""
The attached patch fixes all the ctypes tests so they pass on amd64.
It also fixes several warnings.  I'm not sure what else to do with the
patch.  Let me know how you want to handle these in the future.

I'm not sure the patch is 100% correct.  You will need to decide what
can be 64 bits and what can't.  I believe
sq_{item,slice,ass_item,ass_slice} all need to use Py_ssize_t.  The
types in ctypes.h may not require all the changes I made.  I don't
know how you want to support older version, so I unconditionally
changed the types to Py_ssize_t.
"""

The patch is also in the ctypes SVN repository now, after small
changes to add compatibility with older Python versions.
diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h
index e2569a6..9347c99 100644
--- a/Modules/_ctypes/ctypes.h
+++ b/Modules/_ctypes/ctypes.h
@@ -50,9 +50,9 @@
 	char *b_ptr;		/* pointer to memory block */
 	int  b_needsfree;	/* need _we_ free the memory? */
 	CDataObject *b_base;	/* pointer to base object or NULL */
-	int b_size;		/* size of memory block in bytes */
-	int b_length;		/* number of references we need */
-	int b_index;		/* index of this object into base's
+	Py_ssize_t b_size;	/* size of memory block in bytes */
+	Py_ssize_t b_length;	/* number of references we need */
+	Py_ssize_t b_index;	/* index of this object into base's
 				   b_object list */
 	PyObject *b_objects;	/* list of references we need to keep */
 	union value b_value;
@@ -64,9 +64,9 @@
 	char *b_ptr;		/* pointer to memory block */
 	int  b_needsfree;	/* need _we_ free the memory? */
 	CDataObject *b_base;	/* pointer to base object or NULL */
-	int b_size;		/* size of memory block in bytes */
-	int b_length;		/* number of references we need */
-	int b_index;		/* index of this object into base's
+	Py_ssize_t b_size;	/* size of memory block in bytes */
+	Py_ssize_t b_length;	/* number of references we need */
+	Py_ssize_t b_index;	/* index of this object into base's
 				   b_object list */
 	PyObject *b_objects;	/* list of references we need to keep */
 	union value b_value;
@@ -94,8 +94,8 @@
 #define StgDict_Check(v)	    PyObject_TypeCheck(v, &StgDict_Type)
 
 extern int StructUnionType_update_stgdict(PyObject *fields, PyObject *type, int isStruct);
-extern int PyType_stginfo(PyTypeObject *self, int *psize, int *palign, int *plength);
-extern int PyObject_stginfo(PyObject *self, int *psize, int *palign, int *plength);
+extern int PyType_stginfo(PyTypeObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength);
+extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength);
 
 
 
@@ -118,7 +118,7 @@
 		int pack, int is_big_endian);
 
 extern PyObject *CData_AtAddress(PyObject *type, void *buf);
-extern PyObject *CData_FromBytes(PyObject *type, char *data, int length);
+extern PyObject *CData_FromBytes(PyObject *type, char *data, Py_ssize_t length);
 
 extern PyTypeObject ArrayType_Type;
 extern PyTypeObject Array_Type;
@@ -137,7 +137,7 @@
 #define StructTypeObject_Check(v)	PyObject_TypeCheck(v, &StructType_Type)
 
 extern PyObject *
-CreateArrayType(PyObject *itemtype, int length);
+CreateArrayType(PyObject *itemtype, Py_ssize_t length);
 
 extern void init_callbacks_in_module(PyObject *m);
 
@@ -164,9 +164,9 @@
 
 typedef struct {
 	PyObject_HEAD
-	int offset;
-	int size;
-	int index;			/* Index into CDataObject's
+	Py_ssize_t offset;
+	Py_ssize_t size;
+	Py_ssize_t index;		/* Index into CDataObject's
 					   object array */
 	PyObject *proto;		/* a type or NULL */
 	GETFUNC getfunc;		/* getter function if proto is NULL */
@@ -185,9 +185,9 @@
    too much risk to change that now, and there are other fields which doen't
    belong into this structure anyway.  Maybe in ctypes 2.0... (ctypes 2000?)
 */
-	int size;		/* number of bytes */
-	int align;		/* alignment requirements */
-	int length;		/* number of fields */
+	Py_ssize_t size;	/* number of bytes */
+	Py_ssize_t align;	/* alignment requirements */
+	Py_ssize_t length;	/* number of fields */
 	ffi_type ffi_type;
 	PyObject *proto;	/* Only for Pointer/ArrayObject */
 	SETFUNC setfunc;	/* Only for simple objects */
@@ -298,17 +298,17 @@
 
 extern PyObject *
 CData_get(PyObject *type, GETFUNC getfunc, PyObject *src,
-	  int index, int size, char *ptr);
+	  Py_ssize_t index, Py_ssize_t size, char *ptr);
 
 extern int
 CData_set(PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value,
-	  int index, int size, char *ptr);
+	  Py_ssize_t index, Py_ssize_t size, char *ptr);
 
 extern void Extend_Error_Info(PyObject *exc_class, char *fmt, ...);
 
 struct basespec {
 	CDataObject *base;
-	int index;
+	Py_ssize_t index;
 	char *adr;
 };
 
@@ -374,7 +374,7 @@
 
 extern void _AddTraceback(char *, char *, int);
 
-extern PyObject *CData_FromBaseObj(PyObject *type, PyObject *base, int index, char *adr);
+extern PyObject *CData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr);
 
 /* XXX better name needed! */
 extern int IsSimpleSubType(PyObject *obj);