content: package com.lody.virtual.server.secondary;
  
  import android.os.Binder;
  import android.os.IInterface;
  import android.os.Parcel;
  import android.os.Process;
  import android.os.RemoteException;
  
  /**
   * @author Lody
   */
  public class FakeIdentityBinder extends Binder {
  
      private Binder mBase;
  
      public FakeIdentityBinder(Binder binder) {
          this.mBase = binder;
      }
  
      public final void attachInterface(IInterface owner, String descriptor) {
          mBase.attachInterface(owner, descriptor);
      }
  
      public final String getInterfaceDescriptor() {
          return mBase.getInterfaceDescriptor();
      }
  
      public final boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
          long clearCallingIdentity = Binder.clearCallingIdentity();
          try {
              Binder.restoreCallingIdentity(getFakeIdentity());
              return mBase.transact(code, data, reply, flags);
          } finally {
              Binder.restoreCallingIdentity(clearCallingIdentity);
          }
      }
  
      /**
       * See: http://androidxref.com/6.0.1_r10/xref/frameworks/native/libs/binder/IPCThreadState.cpp#356
       */
      protected long getFakeIdentity() {
          return (long) getFakeUid() << 32 | (long) getFakePid();
      }
  
      protected int getFakeUid() {
          return Process.myUid();
      }
  
      protected int getFakePid() {
          return Process.myPid();
      }
  
      public final IInterface queryLocalInterface(String descriptor) {
          return mBase.queryLocalInterface(descriptor);
      }
  }
  