diff --git a/dlls/gdi32/brush.c b/dlls/gdi32/brush.c
index f7920df..76d2c98 100644
--- a/dlls/gdi32/brush.c
+++ b/dlls/gdi32/brush.c
@@ -270,7 +270,7 @@
  */
 HBRUSH WINAPI CreateDIBPatternBrushPt( const void* data, UINT coloruse )
 {
-    const BITMAPINFO *info=(const BITMAPINFO*)data;
+    const BITMAPINFO *info=data;
     LOGBRUSH logbrush;
 
     if (!data)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index c8a3c4c..bb67232 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -382,7 +382,7 @@
     newdc->vportExtY        = dc->vportExtY;
     newdc->BoundsRect       = dc->BoundsRect;
 
-    newdc->hSelf = (HDC)handle;
+    newdc->hSelf = handle;
     newdc->thread    = GetCurrentThreadId();
     newdc->refcount  = 1;
     newdc->saveLevel = 0;
diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index 7782c51..dabcf53 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -616,8 +616,8 @@
     }
 
     colorPtr = (LPBYTE) info + (WORD) info->bmiHeader.biSize;
-    rgbTriples = (RGBTRIPLE *) colorPtr;
-    rgbQuads = (RGBQUAD *) colorPtr;
+    rgbTriples = colorPtr;
+    rgbQuads = colorPtr;
 
     /* Transfer color info */
 
diff --git a/dlls/gdi32/enhmetafile.c b/dlls/gdi32/enhmetafile.c
index c329338..4cbd9e3 100644
--- a/dlls/gdi32/enhmetafile.c
+++ b/dlls/gdi32/enhmetafile.c
@@ -2600,8 +2600,7 @@
 
     TRACE( "copying 0x%08x palettes\n", dwNumPalToCopy );
 
-    memcpy( (LPVOID)info->lpPe,
-            (LPCVOID)(((LPCSTR)lpEof) + lpEof->offPalEntries),
+    memcpy( info->lpPe, (LPCSTR)lpEof + lpEof->offPalEntries,
             sizeof( *(info->lpPe) ) * dwNumPalToCopy );
 
     /* Update the passed data as a return code */
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index de135d2..c9c566a 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -197,7 +197,7 @@
     physDev->emh->nRecords++;
 
     if(physDev->hFile) {
-	if (!WriteFile(physDev->hFile, (char *)emr, emr->nSize, NULL, NULL))
+        if (!WriteFile(physDev->hFile, emr, emr->nSize, NULL, NULL))
 	    return FALSE;
     } else {
         DWORD nEmfSize = HeapSize(GetProcessHeap(), 0, physDev->emh);
@@ -407,7 +407,7 @@
             EMFDRV_DeleteDC( dc );
             return 0;
         }
-        if (!WriteFile( hFile, (LPSTR)physDev->emh, size, NULL, NULL )) {
+        if (!WriteFile( hFile, physDev->emh, size, NULL, NULL )) {
             EMFDRV_DeleteDC( dc );
             return 0;
 	}
@@ -482,8 +482,8 @@
             return 0;
         }
 
-        if (!WriteFile(physDev->hFile, (LPSTR)physDev->emh,
-                       sizeof(*physDev->emh), NULL, NULL))
+        if (!WriteFile(physDev->hFile, physDev->emh, sizeof(*physDev->emh),
+                       NULL, NULL))
         {
             CloseHandle( physDev->hFile );
             EMFDRV_DeleteDC( dc );
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 7862565..c3f12f2 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -920,8 +920,8 @@
     }
     else if(dc->funcs->pGetTextExtentExPoint) {
         FIXME("calling GetTextExtentExPoint\n");
-        ret = dc->funcs->pGetTextExtentExPoint( dc->physDev, (LPCWSTR)indices,
-                                                count, max_ext, nfit, dxs, size );
+        ret = dc->funcs->pGetTextExtentExPoint( dc->physDev, indices, count,
+                                                max_ext, nfit, dxs, size );
     }
 
     release_dc_ptr( dc );
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 61ae475..ec78045 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -4037,7 +4037,7 @@
 {
     const GSUB_CoverageFormat1* cf1;
 
-    cf1 = (GSUB_CoverageFormat1*)table;
+    cf1 = table;
 
     if (GET_BE_WORD(cf1->CoverageFormat) == 1)
     {
@@ -4806,7 +4806,7 @@
             if (!buf || !buflen) break;
 
             memset(buf, 0, buflen);
-            dst = (unsigned int *)buf;
+            dst = buf;
             rgb = (format == WINE_GGO_HRGB_BITMAP || format == WINE_GGO_VRGB_BITMAP);
 
             if ( needsTransform )
diff --git a/dlls/gdi32/metafile.c b/dlls/gdi32/metafile.c
index 83ea2aa..3806c74 100644
--- a/dlls/gdi32/metafile.c
+++ b/dlls/gdi32/metafile.c
@@ -804,8 +804,8 @@
                                       infohdr->biHeight,
                                       infohdr->biPlanes,
                                       infohdr->biBitCount,
-                                      (LPSTR)(mr->rdParm +
-                                      (sizeof(BITMAPINFOHEADER) / 2) + 4))));
+                                      mr->rdParm +
+                                      (sizeof(BITMAPINFOHEADER) / 2) + 4)));
             break;
 
         case BS_DIBPATTERN:
@@ -928,7 +928,7 @@
                                        mr->rdParm[11], /*Height*/
                                        mr->rdParm[13], /*Planes*/
                                        mr->rdParm[14], /*BitsPixel*/
-                                       (LPSTR)&mr->rdParm[15]);  /*bits*/
+                                       &mr->rdParm[15]); /*bits*/
         SelectObject(hdcSrc,hbitmap);
         StretchBlt(hdc, (SHORT)mr->rdParm[9], (SHORT)mr->rdParm[8],
                    (SHORT)mr->rdParm[7], (SHORT)mr->rdParm[6],
@@ -946,7 +946,7 @@
                                         mr->rdParm[8]/*Height*/,
                                         mr->rdParm[10]/*Planes*/,
                                         mr->rdParm[11]/*BitsPixel*/,
-                                        (LPSTR)&mr->rdParm[12]/*bits*/);
+                                        &mr->rdParm[12]/*bits*/);
         SelectObject(hdcSrc,hbitmap);
         BitBlt(hdc,(SHORT)mr->rdParm[6],(SHORT)mr->rdParm[5],
                 (SHORT)mr->rdParm[4],(SHORT)mr->rdParm[3],
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index a1bee45..5525d34 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -339,8 +339,8 @@
         }
 
 	physDev->mh->mtType = METAFILE_MEMORY; /* This is what windows does */
-        if (!WriteFile(physDev->hFile, (LPSTR)physDev->mh,
-                       sizeof(*physDev->mh), NULL, NULL)) {
+        if (!WriteFile(physDev->hFile, physDev->mh, sizeof(*physDev->mh),
+                       NULL, NULL)) {
             MFDRV_DeleteDC( dc );
             return 0;
         }
@@ -457,7 +457,7 @@
         break;
     case METAFILE_DISK:
         TRACE("Writing record to disk\n");
-	if (!WriteFile(physDev->hFile, (char *)mr, rlen, NULL, NULL))
+        if (!WriteFile(physDev->hFile, mr, rlen, NULL, NULL))
 	    return FALSE;
         break;
     default:
diff --git a/dlls/gdi32/mfdrv/objects.c b/dlls/gdi32/mfdrv/objects.c
index 8370a2c..b4f66ec 100644
--- a/dlls/gdi32/mfdrv/objects.c
+++ b/dlls/gdi32/mfdrv/objects.c
@@ -520,7 +520,7 @@
     BOOL        creationSucceed;
     int         sizeofPalette;
 
-    GetObjectA(hPalette, sizeof(WORD), (LPSTR) &wNumEntries);
+    GetObjectA(hPalette, sizeof(WORD), &wNumEntries);
 
     if (wNumEntries == 0) return 0;
 
diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c
index c18254b..f03d501 100644
--- a/dlls/gdi32/region.c
+++ b/dlls/gdi32/region.c
@@ -1430,8 +1430,7 @@
 	dst->extents.top = src->extents.top;
 	dst->extents.right = src->extents.right;
 	dst->extents.bottom = src->extents.bottom;
-	memcpy((char *) dst->rects, (char *) src->rects,
-	       (int) (src->numRects * sizeof(RECT)));
+        memcpy(dst->rects, src->rects, src->numRects * sizeof(RECT));
     }
     return;
 }
diff --git a/dlls/gdi32/tests/gdiobj.c b/dlls/gdi32/tests/gdiobj.c
index 6f051b0..67a135e 100644
--- a/dlls/gdi32/tests/gdiobj.c
+++ b/dlls/gdi32/tests/gdiobj.c
@@ -110,7 +110,7 @@
 static DWORD WINAPI thread_proc(void *param)
 {
     LOGPEN lp;
-    struct hgdiobj_event *hgdiobj_event = (struct hgdiobj_event *)param;
+    struct hgdiobj_event *hgdiobj_event = param;
 
     hgdiobj_event->hdc = CreateDC("display", NULL, NULL, NULL);
     ok(hgdiobj_event->hdc != NULL, "CreateDC error %u\n", GetLastError());
